您的位置:首页 > 其它

排序算法-(随机)快速排序(递归)

2013-03-12 16:20 253 查看
1.快速排序

快速排序的基本思路属于分治算法的一种,通过选择数组中的某一个元素作为分界点(key),大于key的元素放置在数组右边,小于key的元素放置在数组的左边,然后通过递归调用该过程来实现排序算法。

代码如下:

int Partition(int *A, int p, int q){
int i = p;
int key = A[i];
for(int j = p+1; j <= q, j++){
if(A[j]<key){
i++;
int temp = A[i];
A[i] = A[j];
A[j] = temp;
}
}
int temp = A[i];
A[i] = A[P];
A[p] = temp;

return i;
}

void QuickSort(int *A, int p, int q){
if(p<q){
int r = Partition(A, p, q);
QuickSort(A, p, r-1);
QuickSort(A, r+1, q);
}else{
return ;
}
}


代码中主要有两个函数Partition(int *A, int p, int q)和QuickSort(int *A, int p, int q),

其中,Partition(int *A, int p, int q)中,指针A指向待排序的数组,p为待排序数组的起点,q为终点,函数中选用数组的起点A[p]作为分界点(key),结果该函数调用后,数组A中大于key的元素在key的右边,小于key的元素在key的左边。

QuickSort(int *A, int p , int q)函数为快速排序的实现函数,通过递归调用每次对数组进行分界Partition操作,最终实现对数组的排序。

2.随机快速排序

在快速排序中每次对数组的分界操作Partition都是以数组的其实点作为分界点(key),这样就带来了一个问题——当待排序数组是一个已排好序的数组时,快速排序的执行时间是O(n平方),在执行 时间上比较耗时,于是就有了随机快速排序的思想。

在随机快速排序中,每次对数组的分界操作Partition都是在数组中随机寻找一个元素作为分界点(key),这样就避免了上诉问题,随机排序的平均在执行时间为O(n*lg(n))。比上面的O(n平方)有很大的提高。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: