快速排序
(1)定义顺序表的存储结构;
(2)在顺序表上实现快速排序;
(3)用大量的数据测试最好、最坏和平均情况下的排序速度。
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
using namespace std;
//定义顺序表的存储结构;
typedef struct {
int key;//关键字项
int otherinfo;//其他数据元素
}RedType;
typedef struct {
RedType r[105];//r[0]闲置或用作哨兵单元
int length;//顺序表表长
}SqList;//顺序表类型
void CreatSq(SqList &L) {
printf("请输入数据个数:");
scanf("%d", &L.length);
printf("请输入%d个数据元素:", L.length);
for (int i = 1; i <= L.length; i++)
scanf("%d", &L.r[i].key);
}
void Print(SqList L) {
printf("升序输出:");
for (int i = 1; i <= L.length; i++)
printf("%d ", L.r[i].key);
printf("\n\n");
}
int Patition(SqList &L, int low, int high) {
//交换顺序表L中子表r[low..high]的记录,枢轴记录到位,并返回其所在位置
//此时在它之前(后)的记录均不大于(小于)它
L.r[0] = L.r[low]; //用子表的第一个记录作枢轴记录
int pivotkey = L.r[low].key; //枢轴记录关键字
while (low < high) { //从表的两端向中间扫描
while (low < high && L.r[high].key >= pivotkey)
--high;
L.r[low] = L.r[high]; //将比枢轴小的记录移动到低端
while (low < high && L.r[low].key <= pivotkey)
++low;
L.r[high] = L.r[low]; //将比枢轴大的记录移动到高端
}
L.r[low] = L.r[0]; //枢轴记录到位
return low; //返回枢轴位置
}
void QSort(SqList &L, int low, int high) {
//对顺序表L中的子序列L.r[low...high]做快速排序
if (low < high) { //长度大于等于1
int pivotloc = Patition(L, low, high); //一分为二
QSort(L, low, pivotloc - 1); //对低子表递归排序
QSort(L, pivotloc + 1, high); //对高子表递归排序
}
}
void QuickSort(SqList &L) {
//对顺序表L做快速排序
CreatSq(L);
QSort(L, 1, L.length);
Print(L);
}
int main()
{
SqList L;
printf("快速排序排序\n");
QuickSort(L);
system("pause");
return 0;
}