本系列博文为博主学习笔记,希望大家能从中多多少少学习到一些算法思想。如有记述不周到的地方请谅解;如能指出,万分感谢。
快速排序介绍
快速排序是冒泡排序的改进版,也是最好的一种内排序,很多面试题中都会出现,也是作为程序员必须掌握的一种排序方法。
1. 代码模板实现
话不多说,先上代码。
#include <stdio.h>
int n ;
int q[100010] ;
void quick_sort(int l, int r){
if(l >= r )return;
//设置一个分界点
int x = q[l+r>>1] ;
int i = l - 1 ;
int j = r + 1 ;
while (i < j){
do i++ ; while(q[i] < x);
do j-- ; while(q[j] > x);
if(i < j) {
int tmp = q[i] ;
q[i] = q[j];
q[j] = tmp;
}
}
quick_sort(l,j);
quick_sort(j+1,r);
}
int main(){
scanf("%d",&n);
for(int i = 0 ; i < n; ++i){
scanf("%d",&q[i]);
}
quick_sort(0,n-1);
for(int i = 0 ; i < n;++i){
printf("%d ",q[i]);
}
return 0 ;
}
2. 算法思想
第一步: 确定好分界点 x 。
第二步: 调整区间 ,将小于x 的数移到左区间,将大于x的数移到右区间。
第三步 : 递归的处理左右两个区间,直至结束。
下面再看看示图理解下吧:
第一行为待排序的个数
第二行为待排数组
第三行为排序结果
算法分析:
1.当分界点为待排序元素中的"中值",为最好的情况,时间复杂度为O(nlog2n)。
2.快速排序的空间复杂度为O(log2n).
3.当待排序元素类似[6,1,3,7,3]且基准元素为6时,经过分区,形成[1,3,3,6,7],
两个3的相对位置发生了改变,所是快速排序是一种不稳定排序。