- 冒泡排序
(1)定义顺序表的存储结构;
(2)在顺序表上实现冒泡排序;
(3)将普通的冒泡排序进行多次改进以提高排序速度,并用大量数据测试其速度的提高。 - 快速排序
(1)定义顺序表的存储结构;
(2)在顺序表上实现快速排序;
(3)用大量的数据测试最好、最坏和平均情况下的排序速度。 - 堆排序
(1)定义顺序表的存储结构;
(2)在顺序表上实现堆排序;
(3)用大量的数据测试最好、最坏和平均情况下的排序速度。
4.比较各种排序方法的优缺点和适用场合
第一题
#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");
}
//(2)在顺序表上实现冒泡排序;
void BubbleSort_A(SqList &L) {
CreatSq(L);
for (int i = 1; i<L.length; i++) {
for (int j = 2; j <= L.length; j++) {
if (L.r[j - 1].key>L.r[j].key) {
swap(L.r[j - 1].key, L.r[j].key);
}
}
}
Print(L);
}
//冒泡法第一步优化
//若在一次排序中没有发生交换,说明此时已经全部有序无需再进行扫描
//增加一个标记,记录是否进行过交换
void BubbleSort_B(SqList &L) {
CreatSq(L);
bool flag;//标记是否进行了排序
for (int i = 1; i<L.length; i++) {
flag = false;
for (int j = 2; j <= L.length; j++) {
if (L.r[j-1].key>L.r[j].key) {
swap(L.r[j-1].key, L.r[j].key);
flag = true;
}
}
if (!flag) break;//若没有排序,序列有序,退出
}
Print(L);
}
//若上次排序位置为end,表示end-n的数已经有序,下次排序不需要再遍历
void BubbleSort_C(SqList &L) {
CreatSq(L);
bool flag = true;
int end = L.length;
int k = end;
for (int i = 1; i<L.length; i++) {
flag = false;
for (int j = 2; j <= end; j++) {
if (L.r[j - 1].key>L.r[j].key) {
swap(L.r[j - 1].key, L.r[j].key);
flag = true;
k = j;
}
}
end = k;
if (!flag) break;
}
Print(L);
}
int main()
{
SqList L;
printf("1.普通冒泡排序\n");
BubbleSort_A(L);
printf("2.第一步优化后冒泡排序\n");
BubbleSort_B(L);
printf("3.第二步优化后冒泡排序\n");
BubbleSort_C(L);
system("pause");
return 0;
}
第二题
#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;
}
第三题
#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;//顺序表类型
typedef SqList HeapType;
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");
}
void HeapAdjust(HeapType &H, int s, int m) {
//已知H.r[s..m]中记录的关键字除H.r[s].key之外均满足堆的定义
//本函数调整H.r[s]的关键字,使H.r[s..m]成为一个大顶堆
RedType rc = H.r[s];
for (int j = 2 * s; j <= m; j *= 2) { //沿key较大的孩子节点向下筛选
if (j < m && H.r[j].key >= H.r[j + 1].key) ++j;//j为key较大的记录的下标
if (rc.key < H.r[j].key) break; //rc应插入在位置s上
H.r[s] = H.r[j];
s = j;
}
H.r[s] = rc; //插入
}
void HeapSort(HeapType &H) {
//对顺序表H进行堆排序
for (int i = H.length / 2; i > 0; i--) //把H.r[1..H.length]建成大顶堆
HeapAdjust(H, i, H.length);
for (int i = H.length; i > 1; i--) {
swap(H.r[1], H.r[i]); //将堆顶记录和当前未经排序的子序列Hr[1..i]中最后一个记录相互交换
HeapAdjust(H, 1, i - 1);//将H.r[1..i-1]重新调整为大顶堆
}
}
int main()
{
SqList L;
printf("堆排序排序\n");
CreatSq(L);
HeapSort(L);
Print(L);
system("pause");
return 0;
}