1.算法基本思想
1.在待排序表中任选一个元素pivot作为枢轴(通常取首元素)
2.通过一趟排序将待排序表划分为独立的两部分L[1...k-1]和L[k+1...n]
L[1...k-1]中的所有元素小于pivot,L[k+1...n]中的所有元素大于pivot
3.分别在这两个部分重复1,2操作
2.实现代码
/*快速排序*/
void QuickSort(int A[],int low,int high)
{
if(low<high) //递归跳出的条件
{
int pivotpos=Partition(A,low,high); //划分
QuickSort(A,low,pivotpos-1);
QuickSort(A,pivotpos+1,high);
}
}
//用第一个元素将待排序序列划分成左右两个部分
int Parttion(int A[],int low,int high)
{
int pivot=A[low]; //第一个元素作为枢轴
while(low<high) //用high,low搜索枢轴的最终位置
{
while(low<high&&A[high]>=pivot)
--high;
A[low]=A[high]; //比枢轴小的元素移动到左端
while(low<high&&A[low]<=pivot)
++low;
A[high]=A[low]; //比枢轴大的移动到右端
}
A[low]=pivot; //枢轴元素存放到最终位置
return low; //返回存放枢轴的最终位置
}
3.快速排序算法性能分析
空间复杂度
最好:O(log2(n))
最坏:O(n)
时间复杂度:
最好:O(nlog2(n) (划分均匀)
最坏:O(n²) (原本有序或逆序)
平均时间复杂度:O(nlog2(n))
稳定性:不稳定