快速排序及c++实现

一个暑假的闲暇,玩的是舒服了,可是脑子里的各种算法却忘了,果然编程是个靠保持状态的活,昨天复习了便快排,拿出来写个博客加深个印象。
简介:快排是基于分治模式的,它的平均时间复杂度为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);
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值