快速排序
作者:互联网
快速排序是排序算法中平均时间复杂度为O(nlogn)的一种算法,其实现需要先解决这样一个问题:对一个序列A[1]、A[2]、…、A[n],调整序列中元素的位置,使得A[1](原序列的A[1],下同)的左侧所有元素都不超过A[1]、右侧所有元素都大于A[1]。例如对序列{5,3,9,6,4,1}来说,可以调整序列中元素的位置,形成序列{3,1,4,5,9,6},这样就让A[1]=5左侧的所有元素都不超过它、右侧的所有元素都大于它。
程序代码:
#include<cstdio>
const int n=11;
//对区间[left,right]进行划分
int Partition(int A[], int left, int right) {
int temp = A[left]; //将主元(A[left])存放至临时变量temp
while(left<right) { //只要left和right不相遇
while(left<right&&A[right]>temp) right--; //比较主元和从右侧开始遍历的元素,元素大于主元则左移
A[left] = A[right]; //元素不大于主元,将此元素A[right]挪到A[left]
while(left<right&&A[left]<=temp) left++; //比较主元和从左侧开始遍历的元素,元素小于等于主元则右移
A[right] = A[left]; //元素大于主元,将此元素A[left] 挪到A[right]
}
A[left] = temp; //把temp放到left与right相遇的地方
return left; //返回相遇的下标
}
//快速排序,left与right初值为序列首位下标(例如1与n)
void quickSort(int A[],int left,int right) {
if(left<right) {
//将[left,right]按A[left]一分为二
int pos = Partition(A,left,right);
quickSort(A,left,pos-1); //对左子区间递归进行快速排序
quickSort(A,pos+1,right); //对右子区间递归进行快速排序
}
}
int main(){
int A[n]={35,18,16,72,24,65,12,88,46,28,55};
quickSort(A,0,10);
for(int i=0;i<n;i++){
printf("%d\n",A[i]);
}
return 0;
}
运行结果:
在上述的代码中,我们将数组的第一个元素即A[left]定为主元,其实这样是不合理的,会导致时间复杂度出现及其不合理的差距甚至达到最坏的时间复杂度O(n^2)。正确的方法是随机选取主元。如下所示:
标签:right,int,元素,主元,序列,排序,快速,left 来源: https://blog.csdn.net/qq_42410605/article/details/99837431