话不多说,直接上代码。
#include<iostream>
#include<cstdlib>
#define MAXNUM 10
using namespace std;
typedef int KeyType;
//顺序表定义
typedef struct {
KeyType key;
//DataType info;
}ElemType;
typedef struct {
ElemType data[MAXNUM];
int n;
}SqList;
//顺序表初始化
void initList(SqList* L, int n, int list[]) {
int i;
for (i = 1; i <= n; i++)
L->data[i].key = list[i - 1];
L->n = n;
}
//冒泡排序
void bubbleSort(SqList* L) {
ElemType temp;
for (int i = 1; i < L->n; i++) {
bool flag = false;
for (int j = 1; j <= L->n - i; j++) {
if (L->data[j].key > L->data[j + 1].key) {
temp = L->data[j + 1];
L->data[j + 1] = L->data[j];
L->data[j] = temp;
flag = true;
}
}
if (!flag) break;
}
}
//堆调整
void heapAdjust(SqList* L, int s, int m) {
ElemType r;
r = L->data[s];
for (int j = s * 2; j <= m; j *= 2) {
if (j < m && L->data[j].key < L->data[j + 1].key) j++;
if (r.key >= L->data[j].key) break;
L->data[s] = L->data[j];
s = j;
}
L->data[s] = r;
}
//建堆
void createHeap(SqList* L) {
for (int i = L->n / 2; i > 0; i--)
heapAdjust(L, i, L->n);
}
//堆排序
void heapSort(SqList* L) {
createHeap(L);
for (int i = L->n; i > 1; i--) {
ElemType x = L->data[1];
L->data[1] = L->data[i];
L->data[i] = x;
heapAdjust(L, 1, i - 1);
}
}
//选择排序
int selectMinKey(SqList L, int i) {
int k, min = L.data[i].key, min_index = i;
for (k = i + 1; k <= L.n; k++)
if (min > L.data[k].key) {
min = L.data[k].key;
min_index = k;
}
return min_index;
}
void selectSort(SqList* L) {
int i, j;
ElemType temp;
for (i = 1; i < L->n; i++) {
j = selectMinKey(*L, i);
if (i != j) {
temp = L->data[j];
L->data[j] = L->data[i];
L->data[i] = temp;
}
}
}
//直接插入排序
void insertSort(SqList* L) {
int j;
for (int i = 2; i <= L->n; i++) {
if (L->data[i].key < L->data[i - 1].key) {
L->data[0] = L->data[i];
L->data[i] = L->data[i - 1];
for (j = i - 2; L->data[0].key < L->data[j].key; j--)
L->data[j + 1] = L->data[j];
L->data[j + 1] = L->data[0];
}
}
}
//快排
int rePart(SqList* L, int low, int high) {
int pKey;
L->data[0] = L->data[low];
pKey = L->data[low].key;
while (low < high) {
while (low < high && L->data[high].key >= pKey) high--;
L->data[low] = L->data[high];
while (low < high && L->data[low].key <= pKey) low++;
L->data[high] = L->data[low];
}
L->data[low] = L->data[0];
return low;
}
//快速排序
void quickSort(SqList* L, int low, int high) {
int pKey;
if (low < high) {
pKey = rePart(L, low, high);
quickSort(L, low, pKey - 1);
quickSort(L, pKey + 1, high);
}
}
//归并
void merge(ElemType r[], ElemType r1[], int low, int m, int high) {
int i, j, k; i = low; j = m + 1; k = low;
while ((i <= m) && (j <= high)) {
if (r[i].key <= r[j].key) r1[k++] = r[i++];
else r1[k++] = r[j++];
}
while (i <= m) r1[k++] = r[i++];
while (j <= high) r1[k++] = r[j++];
}
//一趟归并
void mergePass(ElemType r[], ElemType r1[], int n, int h) {
int i, j; i = 1;
while (i + 2 * h <= n) {
merge(r, r1, i, i + h - 1, i + 2 * h - 1);
i += 2 * h;
}
if (i + h <= n) merge(r, r1, i, i + h - 1, n);
else
for (j = i; j <= n; j++)
r1[j] = r[j];
}
//归并排序
void mergeSort(SqList* L) {
ElemType r1[MAXNUM];
int h; h = 1;
while (h <= L->n) {
mergePass(L->data, r1, L->n, h);
h *= 2;
mergePass(r1, L->data, L->n, h);
h *= 2;
}
}
//输出
void print(SqList* L) {
int i;
for (i = 1; i <= L->n; i++)
cout << L->data[i].key << " ";
cout << endl;
}
int main() {
SqList L;
int a[] = { 49,38,65,97,76,13,27,10 };
//堆排序
initList(&L, 8, a);
heapSort(&L);
cout << "堆排序: ";
print(&L);
//选择排序
initList(&L, 8, a);
selectSort(&L);
cout << "选择排序:";
print(&L);
//直接插入
initList(&L, 8, a);
insertSort(&L);
cout << "直接插入:";
print(&L);
//冒泡
initList(&L, 8, a);
bubbleSort(&L);
cout << "冒泡排序:";
print(&L);
//快排
initList(&L, 8, a);
quickSort(&L, 1, 8);
cout << "快速排序:";
print(&L);
//归并
initList(&L, 8, a);
mergeSort(&L);
cout << "归并排序:";
print(&L);
return 0;
}