• 王道数据结构 (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],继续进 行划分,即对毎轮划分后得到的两部分序列继续划分,直至得到有序序列为止。

  • 相关阅读:
    HBase数据存储格式
    百元买百鸡
    驾驶机动车在高速公路上倒车、逆行、穿越中央分隔带掉头的一次记6分。
    驾驶机动车在高速公路遇到能见度低于200米的气象条件时,最高车速是多少?_2600218
    驾驶人违反交通运输管理法规发生重大事故后,因逃逸致人死亡的,处3年以上7年以下有期徒刑。
    国家级心理咨询师培训(二、三级)_课程开设_北京林业大学在职课程进修班(同等学历)网站
    三级心理咨询师_百度百科
    国家二级心理咨询师_百度百科
    国家二级心理咨询师
    国家二级心理咨询师
  • 原文地址:https://www.cnblogs.com/guangzhou11/p/13524228.html
Copyright © 2020-2023  润新知