排序方法的算法实现
实验目的:
用顺序表存储方式存储实验数据,并实现以下相关算法:
1、希尔排序
2、快速排序
3、堆排序
实验代码如下:
#include <stdio.h>
#include <iostream>
#include <stdlib.h>
using namespace std;
#define MAXSIZE 20
#define LEN(a) sizeof(a)/sizeof(a[0])
typedef int InfoType;
typedef int KeyType;
typedef struct {
KeyType key;
InfoType otherinfo;
} RedType;
typedef struct {
RedType r[MAXSIZE + 1];
int length;
} SqList;
//希尔排序
void ShellInsert(SqList &L, int dk) { /*L.r[0]用作暂存单元*/
int i, j;
for (i = dk + 1; i <= L.length; i++)
if(L.r[i].key < L.r[i-dk].key) {
L.r[0] = L.r[i];
for (j = i-dk; j > 0 && L.r[0].key < L.r[j].key; j -= dk)
L.r[j + dk] = L.r[j];
L.r[j + dk] = L.r[0];
}
}
void ShellSort(SqList &L, int dt[], int t) {
int k;
for (k = 0; k < t ; ++k)
ShellInsert(L, dt[k]);
}
//快速排序
int Partition(SqList &L, int low, int high) {
int pivotkey;
L.r[0] = L.r[low];
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; /*low为轴值记录的最终位置*/
}
void QSort(SqList &L, int low, int high) {
int pivotloc;
if(low<high) {
pivotloc = Partition (L, low, high);
QSort (L, low, pivotloc-1);
QSort (L, pivotloc+1, high);
}
}
void QuickSort(SqList &L) {
QSort(L,1,L.length);
}
//堆排序
void HeapAdjust(SqList &L, int s, int m) {
RedType rc;
int j;
rc = L.r[s];
for(j=2*s; j<=m; j*=2) {
if (j < m && L.r[j].key < L.r[j+1].key) ++j;
if (rc.key >= L.r[j].key) break;
L.r[s]=L.r[j];
s=j;
}
L.r[s] = rc;
}
void HeapSort(SqList &L) {
int i,n=L.length;
RedType x;
for (i = n/2; i >= 1; i--)
HeapAdjust(L, i, n);
for (i = L.length; i > 1; --i) {
x = L.r[1];
L.r[1] =L.r[i];
L.r[i] = x;
HeapAdjust(L, 1, i-1);
}
}
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 main() {
SqList L;
printf("******希尔排序******\n");
int dt[3]= {5,3,1};
CreatSq(L);
printf("排序前:\n");
Print(L);
ShellSort(L,dt,3);
printf("排序后:\n");
Print(L);
printf("******快速排序******\n");
CreatSq(L);
printf("排序前:\n");
Print(L);
QuickSort(L);
printf("排序后:\n");
Print(L);
printf("*******堆排序******\n");
CreatSq(L);
printf("排序前:\n");
Print(L);
HeapSort(L);
printf("排序后:\n");
Print(L);
return 0;
}
运行结果如下:
八次上机实验到这里全部结束啦,白菜热泪盈眶,毕竟一口气写了8篇!如果大家感兴趣可以到我的HEXO博客打赏一波,我的hexo博客地址
这样我会有更大动力发布文章的!!谢谢大家!!