数据结构之交换排序之快速排序(参考整理严蔚敏数据结构)

来源:互联网 发布:笔记本触摸屏测试软件 编辑:程序博客网 时间:2024/05/22 05:32
//Partition函数:将当前无序表的第一个元素放在最终排序后应该在的  //位置上并返回该位置,且该位置左边的元素值皆小于该位置元素的值,  //反之亦然//Qsort函数:调用上面函数并利用上面函数返回的下标将表一分为二,  //并递归处理这两个子表//QuickSort函数:显然是从第一个元素开始,最后一个元素结尾调用  //Qsort函数#include<iostream>using namespace std;#define MAXSIZE 20 // 一个用作示例的小顺序表的最大长度typedef int InfoType; // 定义其它数据项的类型typedef int KeyType; // 定义关键字类型为整型typedef struct RedType // 记录类型{KeyType key; // 关键字项InfoType otherinfo; // 其它数据项,具体类型在主程中定义}RedType;typedef struct SqList // 顺序表类型{RedType r[MAXSIZE + 1]; // r[0]闲置或用作哨兵单元int length; // 顺序表长度}SqList;int Partition(SqList &L, int low, int high){ // 交换顺序表L中子表L.r[low..high]的记录,使枢轴记录到位,// 并返回其所在位置,此时在它之前(后)的记录均不大(小)于它RedType t;KeyType pivotkey;pivotkey = L.r[low].key; // 用子表的第一个记录作枢轴记录while (low<high){ // 从表的两端交替地向中间扫描while (low<high&&L.r[high].key >= pivotkey)--high;t = L.r[low]; // 将比枢轴记录小的记录交换到低端L.r[low] = L.r[high];L.r[high] = t;while (low<high&&L.r[low].key <= pivotkey)++low;t = L.r[low]; // 将比枢轴记录大的记录交换到高端L.r[low] = L.r[high];L.r[high] = t;}return low; // 返回枢轴所在位置}void QSort(SqList &L, int low, int high){ // 对顺序表L中的子序列L.r[low..high]作快速排序int pivotloc;if (low<high){ // 长度大于1pivotloc = Partition(L, low, high); // 将L.r[low..high]一分为二QSort(L, low, pivotloc - 1); // 对低子表递归排序,pivotloc是枢轴位置QSort(L, pivotloc + 1, high); // 对高子表递归排序}}void QuickSort(SqList &L){ // 对顺序表L作快速排序QSort(L, 1, L.length);}void print(SqList L){int i;for (i = 1; i <= L.length; i++)printf("(%d,%d)", L.r[i].key, L.r[i].otherinfo);printf("\n");}#define N 8void main(){RedType d[N] = { { 49, 1 }, { 38, 2 }, { 65, 3 }, { 97, 4 }, { 76, 5 }, { 13, 6 }, { 27, 7 }, { 49, 8 } };SqList l;int i;for (i = 0; i<N; i++)l.r[i + 1] = d[i];l.length = N;printf("排序前:\n");print(l);QuickSort(l);printf("排序后:\n");print(l);}

0 0
原创粉丝点击