實現選擇排序和堆排序——題集(十六)
今天分享一下實現選擇排序和堆排序的源代碼和測試用例,以及一個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;
}
運行結果:
分享如上,如有錯誤,望斧正!願大家學得開心,共同進步!