快排算法

来源:互联网 发布:近几年双十一数据统计 编辑:程序博客网 时间:2024/04/20 14:11

很早之前看学姐写过的一个快排算法,当时琢磨了很久来着,现在我们开的有 算法设计与分析 这门课,书上有讲快排的,琢磨了好一会儿嘞^_^

 

具体代码如下啦:

#include<stdio.h>#include<stdlib.h>// 快排算法平均时间复杂度为 O(nlogn), 最坏情况下为 O(n^2)#define Type intType a[10]={0};void Swap( Type &x, Type &y){Type t;t = x;x = y;y = t;}int Partion( Type a[], int p, int r ){// p,r 为起始和终止坐标int i = p, j = r + 1;//i = rand()%(r-p+1) + p;// 随机选择划分基准点 注意:i 值大小介于 p 到 r 间//Swap(a[i], a[p]);Type x = a[i];//i = p;while(1){while( a[++i] < x && i < r)// i 的值小于 r, 当 i 的值为 r 时并不进行交换,所以就不用循环了{}while( a[--j] > x && j > p){}if(i >= j)break;Swap( a[i], a[j]);}a[p] = a[j];// 只能这样做,假如不事先把 a[p] 单独拿出来,不然直接交换结束后,a[j] = x;// i 和 j 到底哪个指的是值为 x 的,是不确定的return j;}void QuickSort( Type a[], int p, int r){if( p < r){int q = Partion( a, p, r);QuickSort( a, p, q-1);QuickSort( a, p+1, r);}}int main(){int i;printf("Please enter 10 elements: ");for( i = 0; i < 10; i++)scanf("%d", &a[i]);QuickSort( a, 0, 9);for( i = 0; i < 10; i++)printf("%d ", a[i]);printf("\n");return 0;}

快速排序算法的性能取决于划分的对称性,通过修改 Partition 可以设计出采用随机选择策略的快速排序算法。在快速排序算法的每一步当中,当数组还没有被划分时,可以在 a[p]  到 a[r]  间随机选出一个元素作为划分基准,这样可以使划分基准的选择是随机的,从而可以期望划分时较对称的。

 

把上面代码中,添上我注释掉的代码就是 RandomizedPartition 了~~

 

其中用到了 rand()  函数来产生一个随机数,为控制随机数介于 p 到 r 间,利用了模运算O(∩_∩)O

 

 

原创粉丝点击