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

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

        今天分享一下实现选择排序堆排序的源代码和测试用例,以及一个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;
}

运行结果:

 

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


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值