关于quick sort

来源:互联网 发布:二维字符串数组 编辑:程序博客网 时间:2024/06/04 08:07

最原始的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){/*随机取keysrand(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);elsereturn partition(a, mid + 1, e, k);}//只需要partition和swap,不用写Qsort
是第k个位置的所以如果数据不重复可以得出第k大(或小)的数,数据重复的话,师兄说可以用hash表去重,等我研究后了再贴出来。

0 0
原创粉丝点击