排序方法的算法实现

排序方法的算法实现

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

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值