活动地址:CSDN21天学习挑战赛
目录
一、快速排序算法描述
二、快速排序的一次划分
三、划分部分伪代码
四、递归执行快速排序伪代码
五、实例
六、快速排序时间性能分析
七、小结
一、快速排序算法描述
在待排序列选择一个轴值(基准),通过一趟排序将待排序列记录分割成独立的两部分,前一部分的关键码均小于或者等于轴值,后一部分的关键码均大于或者等于轴值,然后分别对这两部分重复上述操作,直至整个序列有序。
二、快速排序的一次划分
变量i,j初始化i=first(第一个元素的下标),j=end(最后一个元素的下标);
首先,j从后向前开始扫描,直到a[j]>a[i],将a[j]和a[i]的位置交换,使关键码小的记录移动到前面去;然后,i从前向后扫描,直到a[i]>a[j],将a[i]和a[j]的位置交换,使关键码大的记录移动到后面去;重复上述过程,直到i=j。
三、划分部分的伪代码
int partition(int a[],int first,int end){
while(i<j){
while(i<j&&a[i]<=a[j])
j--;
if(i<j){//因为a[i]>a[j],交换a[i]和a[j],并调整i
交换a[i]和a[j]的位置;
i++;}
while(i<j&&a[i]<=a[j])
i++;
if(i<j){//因为a[i]>a[j],交换a[i]和a[j],并调整j
交换a[i]和a[j]的位置;
j--;}
return i;//返回轴值}
四、递归执行快速排序伪代码
void quickSort(int a[],int first,int end){//对分割得到的两个子序列递归地执行快速排序
while(first<end){//循环结束的判断标志
pos=partition(a,first,end);
quickSort(a,first,pos-1);
quickSort(a,pos+1,end);} }
五、实例
输入一组数,使用快速排序算法使这组数据从小到大有序排列
输入:43 23 56 12 68 90 6 8
输出:6 8 12 23 43 56 68 90
代码:
运行结果:
六、 快速排序时间性能分析
最好情况:每次划分对一个记录定位后,该记录的左侧部分和右侧部分长度相同;
时间复杂度O(n*log2n)。
最差情况:每次划分只得到一个比上一次划分少一个记录的子序列(另一个子序列为空);
时间复杂度O(n^2)。
平均情况:时间复杂度O(n*log2n)。
七、小结
快速排序不适合待排序列基本有序的情况,在长度较短时,通常选用冒泡排序、直接插入排序、简单选择排序等排序方法合适。