排序方法的算法实现

倖福魔咒の 提交于 2019-12-28 14:29:21

排序方法的算法实现

实验目的:
      用顺序表存储方式存储实验数据,并实现以下相关算法:
   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博客地址
这样我会有更大动力发布文章的!!谢谢大家!!

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!