快速排序及c++实现

来源:互联网 发布:java string类源码分析 编辑:程序博客网 时间:2024/06/16 13:49

一个暑假的闲暇,玩的是舒服了,可是脑子里的各种算法却忘了,果然编程是个靠保持状态的活,昨天复习了便快排,拿出来写个博客加深个印象。
简介:快排是基于分治模式的,它的平均时间复杂度为O(nlgn),最坏复杂度是O(n*n)。
思想:快排的其基本思想是,数组中先随机找个主元(pivot element),而将比主元小的数全放在主元左边,比主元大的数放主元右边,然后再将这个数组根据主元拆分成左右两个数组,再根据上步骤进行排序拆分,直到所有拆分出的数组只有一个元素,即拆无可拆,也就是排序好了。
算法导论给出的伪代码是:

QUICKSORT(A,p,r)  if p<r      then q = PARTITION(A,p,r)          QUICKSORT(A,p,q-1)          QUICKSORT(A,q+1,r) PARTITION(A,p,r)  x=A[r]  i=p-1  for j = p to r-1    do if A[j]<=x    then i=i+1      exchange A[i]=A[j]  exchange A[i+1] A[r]  return i+1

其中伪代码中的“=”其实是左箭头,因为打着麻烦就换成”=”。
函数QUICKSORT是递归式,PARTITION 是具体的排序过程。
这里就直接讲解PARTITION排序过程,其中主元它用的是数组最后一位,然后设置一个下标i=p-1即数组头的前一位,然后再遍历数组A[i],当遇到比主元小的,就让i右移并让i的元素与对比出的比主元小的元素置换,这样遍历完整个数组后,就是把所有比主元小的元素全部移到了i的后边,而比主元大的就在i的右边。
根据这个原理再实现到c++上:


static void QuickSort(int a[],int s,int e){
//s为start,数组头,e为end,数组尾
if(s<e){
int flag = a[e];//主元为数组最后一位
int i = s-1;
int j = s;
while(j<=e){
if(a[j]<=flag){
i++;
//置换
int temp;
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
j++;
}
QuickSort(a,s,i-1);
QuickSort

a,i+1,e);
}
}

原创粉丝点击