1、基本介绍:
实际中最常用的排序算法,期望时间复杂度O(nlgn),且常系数很小。
分治理念步骤:
2、C++代码及步骤:
思路:
1、选主元;
2、小于主元放左边,大于主元放右边,主元放中间,递归调用,直到左边指针>=
右边指针。
注:当待排元素少时,效果不如插入排序,因此下面代码在元素少于100用了插入排序。
void QuickSort(int* A,int N) //算法接口
{
QuickSortReal(A,0,N-1); //主函数入口
}
void QuickSortReal(int* A,int left, int right)
{
if(100<=right-left){ //若待排数组大则用快排,小则用插入排序
int pivot = Medion3(A, left, right) //选主元,可以直接用数组最后一个值作为主元
int i = left; //此位置目前小于主元
int j = right-1; //此位置目前是主元
for(;;){
while(A[++i]<pivot){} //左边大于主元的于
while(A[--j]>pivot){} //右边小于主元的交换
if(i<j) swap(A[i],A[j]);
else break;
}
swap(A[i],A[right-1]); //将主元放在中间位置,i为主元所在下标
QuickSortReal(A,left,i-1);
QuickSortReal(A,i+1,right);
}
else{ // 插入排序
InsertionSort(A,left,Right-left+1);
}
}
int Medion3(int* A,int left, int right) //用于选主元,此部分可以不要,
//直接用数组最后一个元素左主元
{
int center = (left+right)/2;
if(A[left]>A[center]) swap(A[left],A[center];)
if(A[left]>A[right]) swap(A[left],A[right];)
if(A[center]>A[right]) swap(A[center],A[right];)
swap(A[center],A[right-1]); //将主元放数组右边倒数第二位
return A[right-1];
}
参考资料: 算法导论7.1节:快速排序的描述
总结:
1、快速排序为最常用的算法。
2、通常将数组中最后一个元素作为主元。