啊哈!算法1.3 快速排序
快速排序(Quicksort),计算机科学词汇,适用领域Pascal,c++等语言,是对冒泡排序算法的一种改进。
https://baike.baidu.com/item/快速排序算法/369842?fromtitle=快速排序&fromid=2084344&fr=aladdin
说人话:每次与基准数比较,比基准数小的放在左边,比基准数大的放在右边。
快速排序针对上节缺点的改进,冒泡排序也可以优化,比如设置一个flag,如果flag没有变化,那么结束循环,对于元素大部分有序的时候可以减少一些时间。冒泡每趟都有一个元素到最终位置,快速排序也每趟都有一个元素到最终位置。
int a[101],n;//全局变量,因为要在子函数中使用
void quicksort(int left,int right){
int i,j,t,temp;
if (left>right) {
return;
}
temp=a[left];//temp中存放的就是基准数
i=left;
j=right;
while (i!=j) {
//顺序很重要,要先从右往左找,想一想为什么?
//如果14行while和17行while交换是什么结果呢?
while (a[j]>=temp && i<j) {
j--;
}
while (a[i]<=temp && i<j) {
i++;
}
//交换两个数的位置,小于基准数的在左,大于在右
if (i<j) {//没有相遇交换
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
//不要忘记将基准数归位
a[left]=a[i];
a[i]=temp;
quicksort(left, i-1);//递归处理左边
quicksort(i+1, right);//递归处理右边
return;
}
int main(int argc, const char * argv[]) {
int i;
//读入n个待排序的数
scanf("%d", &n);
for (i=1; i<=n; i++) {
scanf("%d", &a[i]);
}
//快速排序
quicksort(1, n);
//输出排序结果
for (i=1; i<=n; i++) {
printf("%d ", a[i]);
}
return 0;
}
输入数据:10
6 1 2 7 9 3 4 5 10 8
2 3 4 5 6 7 8 9 10
快速排序之所以比冒泡排序快,是因为快速排序每次交换都是跳跃式的,而冒泡排序是相邻的。设置基准数目的就是把小于基准数的全部放到基准数的左边,大于基准数的全部放到右边。快速排序是基于一种叫做“二分“的思想,每次基准数归位后,以基准数为界线,在基准数前面和后面分别再调用一次快速排序。
与你一起,站在巨人的肩膀上看世界。