//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)
{ // 长度大于1
pivotloc = 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 8
void 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);
}
数据结构之交换排序之快速排序(参考整理严蔚敏数据结构)
最新推荐文章于 2022-07-22 12:30:30 发布
本文介绍了快速排序算法,包括Partition函数和QSort函数的详细解释,以及如何使用它们进行快速排序。通过示例展示了如何对一个顺序表进行快速排序,并在排序前后打印结果,以验证算法的正确性。
摘要由CSDN通过智能技术生成