2016.8.23--快速排序

来源:互联网 发布:四川麻将规则算法 编辑:程序博客网 时间:2024/05/16 15:48

快速排序

  • 快速排序是冒泡排序的一种改进算法

  • 快速排序将元素序列中的关键字与指定的元素进行比较,将逆序的两个元素交换


代码块

代码实现(基础版)

int partition(int *ar, int low, int high){    int i = low;    int j = high;    int tmp = ar[low];    while (i < j)    {        while (i < j && ar[j] >= tmp)            --j;        if (i < j)            ar[i] = ar[j];        while (i < j && ar[i] <= tmp)            ++i;        if (i < j)            ar[j] = ar[i];    }    ar[i] = tmp;    return i;}void Quicksort(int *ar, int low, int high){    if (low < high)    {        int mid = partition(ar,low,high);        Quicksort(ar, low, mid - 1);        Quicksort(ar, mid + 1, high);    }}void QuickSort(int *ar, int len){    Quicksort(ar,0,len-1);}

测试

int main(){    int ar[11] = { 51,98,12,87,23,76,34,65,45,18,100 };    int len = sizeof(ar)/sizeof(ar[0]);    show(ar, len);    QuickSort(ar,len);    show(ar, len);    return 0;}

结果

1

代码实现(改进版)

//random随机数据作为参考数据,而不是固定的ar[low]//函数partition不变//rand()函数每次默认seed为1,所以每次随机都会是同一个位置//使用srand(time(NULL)),用当前时间去随机seed,可以达到让rand()函数seed变化//从而提高一点随机性void swap(int *a, int *b){    int *tmp = a;    a = b;    b = tmp;}void RandomNum(int *ar, int low, int high){    srand(time(NULL));    int num = rand() % (high-low) ;    swap(ar[low], ar[low + num]);}void Quicksort(int *ar, int low, int high){    if (low < high)    {        RandomNum(ar, low, high);        int mid = partion(ar,low,high);        Quicksort(ar, low, mid - 1);        Quicksort(ar, mid + 1, high);    }}

其它改进方法

1)取数组0,n/2,n-1位置的3个元素,比较下标对应的元素值大小,取中间大小的作为函数partition()的参考值
2)取数组中位数作为参考值,取无序数组中位数的方法在《算法导论》上有
3)(待研究)当数据足够大时,当 high-low>100时(不一定是100,这个数个人认为在100个数左右,所有的排序算法时间差别不是很大,完全在可以接受的范围内),可以和其它的排序算法结合使用,具体情况具体分析(没有最好的,只有最合适的)


2016/8/23

1 0
原创粉丝点击