QuickSort快速排序

来源:互联网 发布:c语言基础书籍推荐 编辑:程序博客网 时间:2024/06/06 00:22

快速排序是一种最常用的排序,速度快,占用空间少


常用排序算法速度比较动图https://www.toptal.com/developers/sorting-algorithms/

假设我们现在要对”6,1,2,7,9,3,4,5,10,8”这10个数进行排序。首先在这个序列中随便找一个数作为基准数(就是一个用来参照的数)。为了方便,就使用第一个数字6作为基准数。然后,所有比基准数大的数放在6的右边,比基准数小的数放在6的左边

方法是,在序列的两端开始“探测”。先从右往左找一个比6小的数,再从左向右找一个比6大的数,然后交换他们。这里可以用两个变量i和j(给他们起个名字叫哨兵i和哨兵j),分别指向序列的最左边和最右边。刚开始时,哨兵i指向序列最左边(即i=1)的数字6。让哨兵j指向序列最右边(即j=10)的数字8。

用一张图来表示(来自啊哈!算法)
等等

重复图片中的步骤,直至排序结束。
实际上,快速排序采用的方法是“二分”的思想,即所说的递归的思想。

快排在c中的表示

#include <stdio.h>int a[101],n;//全局变量,这连个变量需要在子函数中使用void quicksort(int left,int right){    int i,j,temp,t;    if(left>right)    return ;    temp=a[left];//基准数    i = left;    j = right;    while(i!=j)    {        //顺序很重要,要先从右往左找        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 i,j;    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]);    }}

运行结果


这里写图片描述