c++语言编程实现以下排序算法: 1. 直接插入排序算法; 2. 冒泡排序算法; 3. 快速排序算法; 4. 简单选择排序算法; (要求:设置哨兵监视,使用typedef定义关键字类型和哨兵,以及顺序表类型和记录类型)
时间: 2024-04-21 12:30:08 浏览: 80
好的,我可以帮你实现这四种排序算法。以下是代码实现:
```c++
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
const int MAXSIZE = 100;
typedef int KeyType; // 关键字类型
typedef struct {
KeyType key; // 关键字
} DataType; // 记录类型
typedef struct {
DataType r[MAXSIZE + 1]; // r[0] 为哨兵
int length; // 顺序表的长度
} SqList; // 顺序表类型
// 初始化顺序表
void InitList(SqList &L) {
L.length = 0;
}
// 随机生成顺序表
void GenerateList(SqList &L, int n) {
srand(time(NULL));
L.length = n;
for (int i = 1; i <= n; i++) {
L.r[i].key = rand() % 100;
}
}
// 输出顺序表
void PrintList(SqList L) {
for (int i = 1; i <= L.length; i++) {
cout << L.r[i].key << " ";
}
cout << endl;
}
// 直接插入排序
void InsertSort(SqList &L) {
for (int i = 2; i <= L.length; i++) {
if (L.r[i].key < L.r[i - 1].key) {
L.r[0] = L.r[i]; // 设置哨兵
L.r[i] = L.r[i - 1];
int j;
for (j = i - 2; L.r[0].key < L.r[j].key; j--) {
L.r[j + 1] = L.r[j];
}
L.r[j + 1] = L.r[0];
}
}
}
// 冒泡排序
void BubbleSort(SqList &L) {
for (int i = 1; i <= L.length - 1; i++) {
bool flag = false; // 标记是否发生交换
for (int j = 1; j <= L.length - i; j++) {
if (L.r[j].key > L.r[j + 1].key) {
L.r[0] = L.r[j]; // 设置哨兵
L.r[j] = L.r[j + 1];
L.r[j + 1] = L.r[0];
flag = true;
}
}
if (!flag) {
break; // 如果没有发生交换,说明已经有序
}
}
}
// 快速排序
int Partition(SqList &L, int low, int high) {
L.r[0] = L.r[low];
while (low < high) {
while (low < high && L.r[high].key >= L.r[0].key) {
high--;
}
L.r[low] = L.r[high];
while (low < high && L.r[low].key <= L.r[0].key) {
low++;
}
L.r[high] = L.r[low];
}
L.r[low] = L.r[0];
return low;
}
void QuickSort(SqList &L, int low, int high) {
if (low < high) {
int pivotpos = Partition(L, low, high);
QuickSort(L, low, pivotpos - 1);
QuickSort(L, pivotpos + 1, high);
}
}
// 简单选择排序
void SelectSort(SqList &L) {
for (int i = 1; i <= L.length - 1; i++) {
int minpos = i;
for (int j = i + 1; j <= L.length; j++) {
if (L.r[j].key < L.r[minpos].key) {
minpos = j;
}
}
if (minpos != i) {
L.r[0] = L.r[i]; // 设置哨兵
L.r[i] = L.r[minpos];
L.r[minpos] = L.r[0];
}
}
}
int main() {
SqList L;
InitList(L);
GenerateList(L, 10);
cout << "排序前的顺序表:";
PrintList(L);
// 直接插入排序
InsertSort(L);
cout << "直接插入排序后的顺序表:";
PrintList(L);
GenerateList(L, 10);
// 冒泡排序
BubbleSort(L);
cout << "冒泡排序后的顺序表:";
PrintList(L);
GenerateList(L, 10);
// 快速排序
QuickSort(L, 1, L.length);
cout << "快速排序后的顺序表:";
PrintList(L);
GenerateList(L, 10);
// 简单选择排序
SelectSort(L);
cout << "简单选择排序后的顺序表:";
PrintList(L);
return 0;
}
```
代码中使用了 `typedef` 定义了关键字类型 `KeyType` 和记录类型 `DataType`,并使用结构体定义了顺序表类型 `SqList`,同时设置了哨兵监视。四种排序算法的实现分别是 `InsertSort`、`BubbleSort`、`QuickSort` 和 `SelectSort`。在 `main` 函数中,我们先生成了一个随机顺序表,然后分别调用四种排序算法进行排序,并输出排序后的顺序表。
阅读全文