• 王道数据结构 (18) 快速排序


    转发:

    http://c.biancheng.net/cpp/html/2741.html

    #include <stdio.h>
    #include <stdlib.h>
    #define N 6
    int partition(int arr[], int low, int high){
        int key;
        key = arr[low];
        while(low<high){
            while(low <high && arr[high]>= key )
                high--;
            if(low<high)
                arr[low++] = arr[high];
            while( low<high && arr[low]<=key )
                low++;
            if(low<high)
                arr[high--] = arr[low];
        }
        arr[low] = key;
        return low;
    }
    void quick_sort(int arr[], int start, int end){
        int pos;
        if (start<end){
            pos = partition(arr, start, end);
            quick_sort(arr,start,pos-1);
            quick_sort(arr,pos+1,end);
        }
        return;
    }
    int main(void){
        int i;
        int arr[N]={32,12,7, 78, 23,45};
        printf("排序前 
    ");
        for(i=0;i<N;i++)
            printf("%d	",arr[i]);
        quick_sort(arr,0,N-1);
        printf("
     排序后 
    ");
        for(i=0; i<N; i++)
            printf("%d	", arr[i]);
        printf ("
    ");
        system("pause");
        return 0;
    }

    运行结果:

    排序前
    32    12    7    78    23    45
    排序后
    7    12    23    32    45    78

    在上面的代码中,根据前面介绍的步骤一步步实现了快速排序算法。接下来通过示意图来演示第一次划分操作。

    在第一次划分操作中,先进行初始设置,key的值是进行划分的基准,其值为要划分数 组的第一个元素值,在上面的排序序列中为第一个元素值32,同时将low设置为要排序数组中第一个元素的下标,第一次排序操作时其值为0,将high设置为要排序序列最后一个 元素的下标,在上面的排序序列中其第一次取值为5。先将下标为high的数组元素与key进行比较,由于该元素值大于key,因此high向左移动一个位置继续扫描。由于接下来的值为 23,小于key的值,因此将23赋值给下标为low所指向的数组元素。接下来将low右移一 个位置,将low所指向的数组元素的值与key进行比较,由干接下来的12、7都小于key, 因此low继续右移扫描,直至下标low所指向的数组元素的值为78即大于key为止,将78赋值给下标为high所指向的数组元素,同时将high左移一个位置。接下来由于low不再小于high,划分结束。需要注意的是,在进行划分的过程中,都是将扫描的值与key的值进行对比,如果小于key,那么将该值赋值给数组中的另外一个元素,而该元素的值并没有改变。 从图中可以看出这一点,所以需要在划分的最后将作为划分基准的key值赋值给下标为 pos的数组元素,这个元素不再参与接下来的划分操作。


    第一次划分操作


    第一轮划分结束后,得到了左右两部分序列A[0]、A[1]、A[2]和A[4]、A[5],继续进 行划分,即对毎轮划分后得到的两部分序列继续划分,直至得到有序序列为止。

  • 相关阅读:
    JavaScript在Javascript中为String对象添加trim,ltrim,rtrim方法
    JavaScriptjs写的俄罗斯方块
    WinForm中“嵌入的资源”和“资源文件”数据的获取方式
    Facade模式(外观模式)
    windows服务安装程序中如何安装后自动启动
    水晶报表之主从多表数据源批量预览及打印开发设计
    IP地址分类简介
    水晶报表之各节的作用
    水晶报表开发之常用代码以及注意事项
    .Net中后台线程和前台线程的区别
  • 原文地址:https://www.cnblogs.com/guangzhou11/p/13524228.html
Copyright © 2020-2023  润新知