快速排序

来源:互联网 发布:人工智能 大学排名 编辑:程序博客网 时间:2024/05/01 08:27

重新复习一遍算法。

之前有个桶排序和冒泡排序。这两个都比较简单,就先从快排开始,有时间再看一遍。

先讲讲原理:

比如输入的数据是 5 6 2 4 9

先取第一个数5,称这一个是基准数 然后从最后找到第一个比5小的,假设这个下标用j表示。再从第一个数开始找到第一个比基准数大的,假设这个下标用i表示。分别是4和6讲这两个数交换,变成了 5 4 2 6 9。再继续找。(必须j先开始)j到2比基准数小,然后i到2时候和j相遇。表示查找结束,交换基准数和2。变成2 4 5 6 9。现在看起来顺序正好了,但是还不能停止。从5将左右两边分开。左边2 4 5继续再从第一个数开始比较,第一个数2为基准数,j从5开始,i 从2开始。最后还是2 4 5。然后比较之前没比较的右边,6 9 比较。比较6,j从9,i从6开始。j到6与i相遇停止 然后还是6 9.这样一个快速排序完成。代码如下

#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)    {        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);}int main(){    int i,j,t;    printf("scanf:");    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;}
大家理解了代码之后。想想为什么要从右边开始而不是从左边开始。

然后再出个题目 这里快排是从小到大,如果从大到小排列呢?

其实就改一处就好了。。。与基准数的比较i大于基准数,j小于基准数。


0 0