zoukankan      html  css  js  c++  java
  • 交换排序之快速排序

    快速排序(递归):

    #define _CRT_SECURE_NO_WARNINGS
    #include <iostream>
    using namespace std;
    
    #define LEN 8    //    有LEN个元素要排
    #define TEST
    
    struct Record {    //    为了考察排序的稳定性,定义元素是结构体类型
        int key;
        int otherinfo;
    };
    
    int Partition(Record *arr, int low, int high)
    {
        // 交换顺序表L中子序列arr[low..high]的记录,使枢轴记录到位,
        // 并返回其所在位置,此时,在它之前(后)的记录均不大(小)于它
        int pivotkey;
        arr[0] = arr[low];                                    // 用子表的第一个记录作枢轴记录
        pivotkey = arr[low].key;                            // 枢轴记录关键字
        while (low < high) {                                // 从表的两端交替地向中间扫描
            while (low < high && arr[high].key >= pivotkey)
                --high;
            arr[low] = arr[high];                            // 将比枢轴记录小的记录移到低端
            while (low < high && arr[low].key <= pivotkey)
                ++low;
            arr[high] = arr[low];                            // 将比枢轴记录大的记录移到高端
        }
        arr[low] = arr[0];                                    // 枢轴记录到位
        return low;                                            // 返回枢轴位置
    }
    
    void QSort(Record *arr, int low, int high)
    {
    #ifndef TEST 
        static int g_count = 1;
        cout << "Case " << g_count++ << ":  low = " << low << " high = " << high << endl;
    #endif
    
        // 递归到边界时可能出现low = 1, high = 0的情况
        // 对顺序表L中的子序列arr[low..high]进行快速排序
        int pivotloc;
        if (low < high) {                            // 长度大于等于2
            pivotloc = Partition(arr, low, high);    // 将arr[low..high]一分为二
            QSort(arr, low, pivotloc - 1);            // 对低子表递归排序,pivotloc是枢轴位置
            QSort(arr, pivotloc + 1, high);            // 对高子表递归排序
        }
    }
    
    void QuickSort(Record *arr, int length)
    {
        QSort(arr, 1, length);
    }
    
    int main(int argc, char **argv)
    {
        freopen("in.txt", "r", stdin);
        Record a[LEN + 1] = {0};
        for (int i = 1; i <= LEN; i++)
            cin >> a[i].key >> a[i].otherinfo; 
    
        QuickSort(a, LEN);
    
        for (int i = 1; i <= LEN; i++)
            cout << a[i].key << '\t' << a[i].otherinfo << endl;
    
        return 0;
    }
    
    /*
    if in.txt:
    49 1
    38 0
    65 0
    97 0
    76 0
    13 0
    27 0
    49 2
    
    then out:
    13      0
    27      0
    38      0
    49      1
    49      2
    65      0
    76      0
    97      0
    
    but if in.txt:
    38 0
    49 1
    65 0
    97 0
    76 0
    13 0
    27 0
    49 2
    
    then out:
    13      0
    27      0
    38      0
    49      2
    49      1
    65      0
    76      0
    97      0
    */

    待加分析

  • 相关阅读:
    Code Review 五问五答
    JavaScript 10分钟入门
    swagger editor使用
    Tyk API网关介绍及安装说明
    Castle 多继承选择
    线程信息的获取和设置
    s3 api接口的调用
    在Hadoop集群上的HBase配置
    OpenStack 单元测试
    在Hadoop集群上的Hive配置
  • 原文地址:https://www.cnblogs.com/jjtx/p/2545751.html
Copyright © 2011-2022 走看看