基本思想
冒泡排序的一种改进。通过一趟排序将待排记录分割成独立的两部分,其中一部分关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。
算法原理
使用分治策略,将一个序列分为两个子序列。
步骤:
在待排序的n个记录中任选一个进行记录(通常选第一个),作为为基准(分区标准)。
进行分区,即:将所有比基准值小的元素放在基准左边,所有比基准值大的元素放在基准的右边,中间为所选的基准。
对左右两个分区递归进行步骤1、2,递归结束条件是序列的大小是0或1。
特点
数据结构:数组
稳定性:不稳定
过程
宏观过程
复杂度与辅助空间
最差时间复杂度:O(n^2)
最优时间复杂度:O(nlog2n)
平均时间复杂度:O(nlgn)
所需辅助空间:O(log2n)~O(n)
源程序
void quickSort(int a[],int low, int high)//a:待排序数组,low:最低位的下标,high:最高位的下标
{
int left=low,right=high;
int key=a[left];//用数组的第一个记录作为分区元素
if(low>=high)
return;
while(left!=right){
while(left<right&&a[right]>=key)//从右向左扫描,找第一个码值小于key的记录,并交换到key
right--;
a[left]=a[right];
while(left<right&&a[left]<=key)//从左向右扫描,找第一个码值大于key的记录,并交换到右边
left++;
a[right]=a[left];
}
a[left]=key;//分区元素放到正确位置
quickSort(a,low,left-1);
quickSort(a,left+1,high);
}