实现选择排序和堆排序——题集(十六)
2017-08-02 21:11
375 查看
实现选择排序和堆排序——题集(十六)
今天分享一下实现选择排序和堆排序的源代码和测试用例,以及一个topK问题的求解。
实现选择排序的源代码和运行示例。
源代码如下:
运行结果:
堆排序的源代码和运行示例。
源代码如下:
运行结果:
topK问题:
本公司现在要给公司员工发波福利,在员工工作时间会提供大量的水果供员工补充营养。由于水果种类比较多,但是却又不知道哪种水果比较受欢迎,然后公司就让每个员工报告了自己最爱吃的k种水果,并且告知已经将所有员工喜欢吃的水果存储于一个数组中。然后让我们统计出所有水果出现的次数,并且求出大家最喜欢吃的前k种水果。
统计出所有水果出现的次数,并且求出大家最喜欢吃的前k种水果的源代码和运行示例。
源代码如下:
运行结果:
分享如上,如有错误,望斧正!愿大家学得开心,共同进步!
今天分享一下实现选择排序和堆排序的源代码和测试用例,以及一个topK问题的求解。
实现选择排序的源代码和运行示例。
源代码如下:
#include<iostream> using namespace std; //实现选择排序 void SelectSort(int* tmp, int len){//实现选择排序 if(len<=0) return; int i=0; int end=len-1; while( i<end){ int min=i; int max=end; for(int j=i; j<=end; j++){ if(tmp[j]>tmp[max]){ max=j; } if(tmp[j] < tmp[min]){ min=j; } } swap(tmp[min],tmp[i]); if(max == i){//修正qc//此时max下标指的值,到了min下标下。 swap(min,max); } swap(tmp[end],tmp[max]); ++i; --end; } } void PrintArr(int* aim, int size){//打印 for(int i=0; i<size; i++){ cout<<aim[i]<<" "; } cout<<endl; } void TestSS(){///实现选择排序 cout<<"实现选择排序"<<endl<<endl; //int tmp[]={4,2,1,7,3,8}; int tmp[]={49,38,65,97,76,13,27,49,55,4}; int len=sizeof(tmp)/sizeof(tmp[0]); cout<<"打印原数组: "; PrintArr( tmp, len); SelectSort( tmp, len);//实现选择排序 cout<<"打印选择排序后的数组: "; PrintArr( tmp, len); cout<<endl<<endl; int tmp1[]={97,38,65,97,76,13,27,49,5,4}; len=sizeof(tmp1)/sizeof(tmp1[0]); cout<<"打印原数组: "; PrintArr( tmp1, len); SelectSort( tmp1, len);//实现选择排序 cout<<"打印选择排序后的数组: "; PrintArr( tmp1, len); } int main(){ TestSS();///实现选择排序 system("pause"); return 0; }
运行结果:
堆排序的源代码和运行示例。
源代码如下:
#include<iostream> using namespace std; void AdjuctHeap(int* tmp, int parent, int len){//向下调整 //if(len <= 1) return; int child=parent*2+1; while(child<len){ if(child+1<len && tmp[child+1]>tmp[child]){ ++child; } if(tmp[parent] < tmp[child]){ swap(tmp[parent], tmp[child]); parent=child; child=parent*2+1; } else{ break; } } } void HeapSort(int* tmp, int len){ if(len <= 1) return; //先构成堆 for(int parent=(len-2)/2; parent>=0; parent--){ AdjuctHeap( tmp, parent, len);//向下调整 } //sort for(int size=len-1; size>=0; size--){ swap(tmp[0], tmp[size]); AdjuctHeap( tmp, 0, size);//向下调整 } } void TestHeapS(){///实现堆排序 cout<<"实现堆排序"<<endl<<endl; int tmp[]={49,38,65,97,76,13,27,49,55,4}; int len=sizeof(tmp)/sizeof(tmp[0]); cout<<"打印原数组: "; PrintArr( tmp, len); HeapSort( tmp, len); cout<<"打印堆排序后的数组: "; PrintArr( tmp, len); } int main(){ TestHeapS();///实现堆排序 system("pause"); return 0; }
运行结果:
topK问题:
本公司现在要给公司员工发波福利,在员工工作时间会提供大量的水果供员工补充营养。由于水果种类比较多,但是却又不知道哪种水果比较受欢迎,然后公司就让每个员工报告了自己最爱吃的k种水果,并且告知已经将所有员工喜欢吃的水果存储于一个数组中。然后让我们统计出所有水果出现的次数,并且求出大家最喜欢吃的前k种水果。
统计出所有水果出现的次数,并且求出大家最喜欢吃的前k种水果的源代码和运行示例。
源代码如下:
#include<iostream> using namespace std; #include<algorithm> #include <functional> #include<vector> #include<string> #include<map> //每个员工报告了自己最爱吃的k种水果,统计出所有水果出现的次数,并且求出大家最喜欢吃的前k种水果 //map void GetFavoriteFruit(const vector<string>& fruits, size_t k){ if(k<=0) return; //打印出最喜欢的水果 map<string, int> tmp; int size=fruits.size(); for(int i=0; i<size; i++){ tmp[fruits[i]]++; } int len=tmp.size(); vector<pair<int,string>> aim; map<string, int>::iterator it=tmp.begin(); for(int i=0; i<len; i++){ cout<<" 水果名: "<<it->first<<" ;数目: "<<it->second <<endl; aim.push_back(make_pair(it->second ,it->first)); ++it; } sort(aim.begin(), aim.end(),greater<pair<int,string>>());//默认升序 len=k; if(k>tmp.size()) len=aim.size(); cout<<endl<<"大家爱喜欢的"<<k<<"种水果是: "; for(int i=0; i<len; i++){ cout<<aim[i].second<<" "; } cout<<endl<<endl; } void PrintVector2(vector<string> aim, int size){//打印 for(int i=0; i<size; i++){ cout<<aim[i]<<" "; } cout<<endl; } void TestMaxK(){//求出大家最喜欢吃的前k种水果 string tmp[]={"西瓜", "梨", "李子", "葡萄", "苹果", "梨", "梨", "李子", "葡萄", "西瓜", "苹果", "梨", "李子", "葡萄"}; int len=sizeof(tmp)/sizeof(tmp[0]); vector<string> fruits; for(int i=0; i<len; i++){ fruits.push_back(tmp[i]); } cout<<"求topK问题"<<endl<<endl<<"打印所有水果: "; PrintVector2(fruits, len);//打印 cout<<endl; GetFavoriteFruit(fruits, 3); } int main(){ TestMaxK();//求出大家最喜欢吃的前k种水果 system("pause"); return 0; }
运行结果:
分享如上,如有错误,望斧正!愿大家学得开心,共同进步!
相关文章推荐
- 程序员必知的8大排序(三)-------简单选择排序,堆排序(java实现)
- 排序算法--选择排序(简单选择排序、堆排序)java实现
- 插入排序、冒泡排序、选择排序、希尔排序、快速排序、归并排序、堆排序和LST基数排序——JAVA实现
- 常见比较排序算法的实现(归并排序、快速排序、堆排序、选择排序、插入排序、希尔排序)
- 几种基本排序的实现:选择排序,冒泡排序,插入排序,堆排序,快速排序,归并排序
- Java实现——选择排序、shell排序、合并排序、堆排序
- 选择排序的实现——堆排序
- 【程序员笔试面试必会——排序①】Python实现 冒泡排序、选择排序、插入排序、归并排序、快速排序、堆排序、希尔排序
- c++实现数据结构中的各种排序方法:直接插入、选择,归并、冒泡、快速、堆排序、shell排序
- C语言实现 排序源程序(包括直接插入、希尔、冒泡、快速、简单选择、堆排序)
- 插入法排序、选择排序、冒泡法、快速排序、堆排序的C实现
- 常见的五类排序算法图解和实现(选择类:简单选择排序,锦标赛排序,树形选择排序,堆排序)
- C语言实现 排序源程序(包括直接插入、希尔、冒泡、快速、简单选择、堆排序)
- 程序员必知的8大排序(二)-------简单选择排序,堆排序(java实现)
- 元素排序几种常用的排序算法的分析及java实现(希尔排序,堆排序,归并排序,快速排序,选择排序,插入排序,冒泡排序)
- java版排序算法简介及冒泡排序以及优化,选择排序,直接插入排序,希尔排序,堆排序,快速排序及其优化前言 2 分类 2 稳定性 3 时间复杂度 4 Java实现版本 5 1、冒泡排序 6 2、选择排序
- 插入排序、冒泡排序、选择排序、希尔排序、快速排序、归并排序、堆排序和LST基数排序——C++实现
- 选择排序之堆排序Java实现
- 程序员必知的8大排序(二)-------简单选择排序,堆排序(java实现)
- 九大排序算法及其实现- 插入.冒泡.选择.归并.快速.堆排序.计数.基数.桶排序.堆排序