交换排序之快速排序

快速排序(递归):

#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
*/

待加分析

原文地址:https://www.cnblogs.com/jjtx/p/2545751.html