vlambda博客
学习文章列表

啊哈!算法1.3 快速排序

快速排序(Quicksort),计算机科学词汇,适用领域Pascal,c++等语言,是对冒泡排序算法的一种改进。

https://baike.baidu.com/item/快速排序算法/369842?fromtitle=快速排序&fromid=2084344&fr=aladdin

说人话:每次与基准数比较,比基准数小的放在左边,比基准数大的放在右边。


快速排序针对上节缺点的改进,冒泡排序也可以优化,比如设置一个flag,如果flag没有变化,那么结束循环,对于元素大部分有序的时候可以减少一些时间。冒泡每趟都有一个元素到最终位置,快速排序也每趟都有一个元素到最终位置。

#include <stdio.h>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;}

输入数据:106 1 2 7 9 3 4 5 10 8输出数据:1 2 3 4 5 6 7 8 9 10

快速排序之所以比冒泡排序快,是因为快速排序每次交换都是跳跃式的,而冒泡排序是相邻的。设置基准数目的就是把小于基准数的全部放到基准数的左边,大于基准数的全部放到右边。快速排序是基于一种叫做“二分“的思想,每次基准数归位后,以基准数为界线,在基准数前面和后面分别再调用一次快速排序。

与你一起,站在巨人的肩膀上看世界。