您的位置:首页 > 编程语言 > C语言/C++

快速排序及c++实现

2017-09-02 09:57 190 查看
一个暑假的闲暇,玩的是舒服了,可是脑子里的各种算法却忘了,果然编程是个靠保持状态的活,昨天复习了便快排,拿出来写个博客加深个印象。

简介:快排是基于分治模式的,它的平均时间复杂度为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);

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言 算法