您的位置:首页 > 运维架构

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

2017-08-02 21:11 375 查看
实现选择排序和堆排序——题集(十六)
        今天分享一下实现选择排序和堆排序的源代码和测试用例,以及一个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;
}


运行结果:


 

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

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐