实现选择排序和堆排序——题集(十六)

来源:互联网 发布:java小项目实例 编辑:程序博客网 时间:2024/06/07 01:29

实现选择排序和堆排序——题集(十六)

        今天分享一下实现选择排序堆排序的源代码和测试用例,以及一个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);//向下调整}//sortfor(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种水果//mapvoid 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;}

运行结果:

 

       分享如上,如有错误,望斧正!愿大家学得开心,共同进步!


 

原创粉丝点击