您的位置:首页 > 产品设计 > UI/UE

关于quick sort

2014-01-07 19:41 417 查看
最原始的quick sort就是算法导论上的了:

#include<stdio.h>
void swap(int *a, int *b)
{
int tmp = *a;
*a = *b;
*b = tmp;
}
int partition(int a[], int s, int e)
{
/*
随机取key
srand(time(NULL));
int dx = s + rand() % (e - s + 1);
swap(&a[dx], &a[e]);
*/
int tmp = a[e], mid = s;
for(int i = s; i <= e; i++)
if(a[i] < tmp)
swap(&a[mid++], &a[i]);
swap(&a[mid], &a[e]);
return mid;
}
void Qsort(int a[], int s, int e)
{
if(s < e)
{
int p = partition(a, s, e);
Qsort(a, s, p - 1);
Qsort(a, p + 1, e);
}
}
main()
{
int nums[10] = {1, -1, 2, -2, -2, -3, 1, 5, 0, 10};
Qsort(nums, 0, 9);
for(int i = 0; i < 10; i++)
printf("%d\n", nums[i]);
}
至于quick sort各种优化方法与测试,详见这篇文章(找不到原文链接,只能贴百度文库的了):

http://wenku.baidu.com/link?url=wXRMQ-8OowOYvTuLYRYWikM9Ui03LdrFCi2y4zzpsnbD2mq_FtLPFYeCpwE_RfutNGP1nz1nY7yiPAdkz3GAnvJiGPJT2Ew0Ry5WgH9-y7u&qq-pf-to=pcqq.c2c

利用快排思想取第k个位置的数:

int partition(int a[], int s, int e, int k)//注意k是下标,不是第k个,和描述有些差距
{
int tmp = a[e], mid = s;
for(int i = s; i <= e; i++)
if(a[i] > tmp)
swap(&a[mid++], &a[i]);
swap(&a[mid], &a[e]);
if(mid == k)
return a[mid];
else if(mid > k)
return partition(a, s, mid - 1, k);
else
return partition(a, mid + 1, e, k);
}//只需要partition和swap,不用写Qsort
是第k个位置的所以如果数据不重复可以得出第k大(或小)的数,数据重复的话,师兄说可以用hash表去重,等我研究后了再贴出来。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: