實現選擇排序和堆排序——題集(十六)

實現選擇排序和堆排序——題集(十六)

        今天分享一下實現選擇排序堆排序的源代碼和測試用例,以及一個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;
}

運行結果:

 

       分享如上,如有錯誤,望斧正!願大家學得開心,共同進步!


 

發佈了72 篇原創文章 · 獲贊 15 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章