快速排序的思想是:对于待排序序列首先经过一次扫描,找出序列中的一个轴点,使得轴点左侧的元素均小于该轴点,右侧的元素均大于等于该轴点,然后对轴点左侧的元素序列和轴点右侧的元素序列分别递归的进行。这样,每经过一次扫描,轴点的位置即为排序后最终的位置,也就是说,快速排序,每经过一次扫描,就有一个元素到位,以后每次扫描,此元素位置不会被改变。
算法分析:
稳定性:不稳定。平均时间复杂度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;
}