剑指offer - 快速排序

快速排序的思想是:对于待排序序列首先经过一次扫描,找出序列中的一个轴点,使得轴点左侧的元素均小于该轴点,右侧的元素均大于等于该轴点,然后对轴点左侧的元素序列和轴点右侧的元素序列分别递归的进行。这样,每经过一次扫描,轴点的位置即为排序后最终的位置,也就是说,快速排序,每经过一次扫描,就有一个元素到位,以后每次扫描,此元素位置不会被改变。

算法分析:

    稳定性:不稳定。平均时间复杂度O(nlogn),最坏情况下,当待排序序列为有序时(顺序或逆序),需要O(n^2),最好情况下需要O(nlogn),空间复杂度 O(logn)。

以下为C++代码,如有bug,请指正,谢谢。

#include<iostream>
 using namespace std;


 int partition(int data[],int length,int start,int end);
 void QuickSort(int data[],int length,int start,int end)
 {
if(start == end)
return;
int Index = partition(data,length,start,end);
if(Index>start)
QuickSort(data,length,start,Index-1);
if(Index<end)
QuickSort(data,length,Index+1,end);
 }
 int RandomInRange(int start,int end)
 {
if(start>=end)
return 0;
else
    return start+rand()%(end-start);
 }
 void swap(int* a,int* b)
 {
int temp = *a;
*a = *b;
*b = temp;
 }
 int partition(int data[],int length,int start,int end)
 {
if(data==NULL||length<=0||start<0||end>=length)
throw exception("Invalid Input");
int Index = RandomInRange(start,end);
swap(&data[Index],&data[end]);
int small = start-1;
for(Index = start;Index<end;++Index)
{
if(data[Index]<data[end])
{
small++;
if(small != Index)
{
swap(&data[small],&data[Index]);
}
}
}
++small;
swap(&data[small],&data[end]);
return small;
 }


 int main()
 {
const int length = 10;
int arr[length] = {3,2,4,8,1,5,7,9,10,6};
QuickSort(arr,length,0,9);
for(int i = 0;i<length;++i)
cout<<arr[i]<<" ";
return 0;
 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值