记得刚开始学C的时候,师兄让我们手动实现快排函数,这里最朴素的版本就不写了。
1.稳定排序。
输入一组学生和他们的成绩,排序,但是输入中在前面的学生不希望被排在后面。
代码如下
#include<stdio.h>
#include<stdlib.h>
struct student{
char name[200];
int score;
int a;
};
struct student arr[100010];
void _qsort(struct student ar[],int l,int h){
int ll=l,hh=h;
struct student key;
if(l>=h) return;
key=ar[ll];
while(ll<hh){
while(ll<hh&&(ar[hh].score>key.score||(ar[hh].score==key.score&&ar[hh].a>key.a)))
hh--;
if(ll<hh){
ar[ll]=ar[hh];
ll++;
}
while(ll<hh&&(ar[ll].score<key.score||(ar[ll].score==key.score&&ar[ll].a<key.a)))
ll++;
if(ll<hh){
ar[hh]=ar[ll];
hh--;
}
}
ar[ll]=key;
_qsort(ar,l,ll-1);
_qsort(ar,ll+1,h);
}
int main(){
int i,n;
while(~scanf("%d",&n)){
for(i=0;i<n;i++){
scanf("%s %d",&arr[i].name,&arr[i].score);
arr[i].a=i;
}
_qsort(arr,0,n-1);
for(i=0;i<n;i++){
printf("%s %d\n",arr[i].name,arr[i].score);
}
}
return 0;
}
/*
3
shuxiao 100
somebody 97
donggao 99
*/
2.随机排序
我们知道快排是一种不稳定的排序,对于随机散列的数排的比较快,对于接近有序的数比较慢,最糟糕的情况下依然是N^2。所以我们可以想到,人为的打乱key的取值点,使得这种糟糕的情况出现的概率更小一些。
void qsort1(int *a,int l,int h)
{
int key,aa,ll=l,hh=h;
if(l>=h)return;
aa=rand()%(h-l)+l;//关键点
key=a[aa];
a[aa]=a[ll];
a[ll]=key;
while(ll<hh)
{
while(ll<hh&&a[hh]>=key)
hh--;
if(ll<hh)
{
a[ll++]=a[hh];
}
while(ll<hh&&a[ll]<=key)
ll++;
if(ll<hh)
{
a[hh--]=a[ll];
}
}
a[ll]=key;
qsort1(a,l,ll-1);
qsort1(a,ll+1,h);
}