stable_sort的用法与排序算法

一、sort和stable_sort的区别:

c++中的stable_sort排序函数与sort功能差不多,排序所使用的思路不一样。

 1、sort(a,a+N) ,其中a是数组,a+N表示对a[0]至a[N-1]的N个数进行排序(默认从小到大排序);sort(a,a+N,cmp),第三个参数是一个函数。使用的是快速排序的思路,虽然速度快,但是有不稳定(什么叫不稳定,有两个相同的数A和B,在排序之前A在B的前面,而经过排序之后,B跑到了A的前面,对于这种情况的发生,我们管他叫做排序的不稳定性,自己想一下快速排序的思路就知道为啥不稳定了)。

2、而stable_sort用的是归并排序的思路,刚好解决了sort排序这个缺点。下面为使用stable_sort函数排序的例子(也是考研上机题)

二、题目

题目描述

输入任意(用户,成绩)序列,可以获得成绩从高到低或从低到高的排列,相同成绩
都按先录入排列在前的规则处理。

输入描述:

输入多行,先输入要排序的人的个数,然后输入排序方法0(降序)或者1(升序)再分别输入他们的名字和成绩,以一个空格隔开

输出描述:

按照指定方式输出名字和成绩,名字和成绩之间以一个空格隔开

使用stable_sort函数排序代码如下:

#include<bits/stdc++.h>
using namespace std;
string name [500];
int s[500];
int n,flag;
int r[500];
int cmp1(int i,int j){//从高到低 
	return s[i]<s[j];
}
int cmp2(int i,int j){//从低到高 
	return s[i]>s[j];
}
int main(){
	while(scanf("%d%d",&n,&flag)!=EOF){
	int i;
	for(i=0;i<n;i++){
		r[i]=i;
		cin>>name[i]>>s[i];
	}
	if(flag==1){
		stable_sort(r,r+n,cmp1);
	}else{
		stable_sort(r,r+n,cmp2);
	}
	for(i=0;i<n;i++){
		cout<<name[r[i]]<<' '<<s[r[i]]<<endl;
	}
	} 
	return 0;
}

本题除了这个思路,还可以使用结构体把名字和成绩联系在一起,这样排序也比较好排。我还试过了一个最笨的办法去解决这个问题,也ac了,没有超时。

关于排序的算法,以前大一acm的时候,完全不在话下,2年过去了,现在都不熟悉,开始搞这个题目的时候,比较模糊了。推一个排序算法总结比较好的文章https://www.cnblogs.com/onepixel/articles/7674659.html

发布了84 篇原创文章 · 获赞 18 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/sunandstarws/article/details/88600163