快速排序基本原理:取待排序中的一个数据作为枢纽,利用枢纽元素,将小于或等于枢纽元素的数据放在枢纽元素的左边,将大于枢纽元素的数据放在枢纽元素的右边;然后对两侧数据再次递归。。。最后便得到排列好的数据。【详细说明请查看《算法导论》】
- 快速排序是原址不稳定排序;
- 快排的时间复杂度平均为O(nlgn),最差为O(n^2);
- 由于每次调用Partition,都有一个返回值需要存入栈中,所以空间复杂度为O(lgN) ;
- 枢纽的选择对排序有重要的影响,理想情况是希望枢纽元素两边的数据个数大致相等,因此本文通过随机化的取待排序数据中的一随机数作为枢纽元素,详见代码中RandomInRange()函数。
下面以待排数据长度N=20,Range=100和N=10000,Range=1000进行分析说明。
- 当N=20,Range=100时,运行结果如下
- 而当N=10000,Range=1000时,排序所需花费的时间为 Sorting spends about 6ms
//Codes of the QuickSort
void QuickSort(int *arr,int start,int end)
{//对整个数据区间递归进行快速排序
if(start==end)
return;
int index=Partition(arr,start,end);
if(start<index)
QuickSort(arr,start,index-1);
if(index<end)
QuickSort(arr,index+1,end);
}
int Partition(int *arr,int start,int end)
{//待排区间的划分Partiton
if(arr==NULL || start<0 ||end>=N)
throw exception("Invalid Parameters.");
int index=RandomInRange(start,end);
Swap(arr[index],arr[end]);
int flag=start-1;
for(int ii=start;ii<end;++ii){
if(arr[ii]<arr[end]){
++flag;
if(flag!=ii)
Swap(arr[flag],arr[ii]);
}
}
++flag;
Swap(arr[flag],arr[end]);
return flag;
}
int RandomInRange(int start,int end)
{//随机选择待排区间内的一个元素作为枢纽,返回其下标flag
int range,flag;
range=end-start;
flag=rand()%range+start;
return flag;
}
//Codes of the main function and other auxiliary subfunctions
#include "stdafx.h"
#include <iostream>
#include <exception>
#include <time.h>
using namespace std;
const int N=10000;//待排数据的个数N
const int Range=1000;//待排数据的大小范围【0~Range】
void InputNumber(int *,int );
void OutputNumber(int *,int);
void QuickSort(int *,int ,int);
int Partition(int *,int ,int);
int RandomInRange(int ,int);
inline void Swap(int &,int &);
int _tmain(int argc, _TCHAR* argv[])
{
int arr[N]={0};
InputNumber(arr,N);
cout<<"The input Numbers are-----------------------"<<endl;
OutputNumber(arr,N);
auto tstart=clock();
QuickSort(arr,0,N-1);
auto tend=clock();
auto totaltime=tend-tstart;
cout<<"The sorted Numbers are-----------------------"<<endl;
OutputNumber(arr,N);
cout<<"Sorting spends about "<<tend-tstart<<"ms"<<endl;
return 0;
}
void InputNumber(int *arr,int N)
{
if(arr==NULL)
return;
for(int ii=0;ii<N;++ii)
arr[ii]=rand()%Range;
}
void OutputNumber(int *arr,int N)
{
for(int ii=0;ii<N;++ii)
cout<<arr[ii]<<'\t';
cout<<endl;
}
inline void Swap(int &lhs,int &rhs)
{
int temp;
temp=lhs;
lhs=rhs;
rhs=temp;
}
快速排序分析结束,代码纯属自己看理论后原创,转载请标明出处,也欢迎与大家讨论研究,谢谢!下一篇将介绍最大堆排序Max_Heap_Sort.