排序:选择/折半/快速/希尔/插入

数据存储

#define ElemType int
typedef struct {
	ElemType *elem;
	int Length;
	int ListSize;
}SqList;

数据初始化

下标为0的没有存储数据

void InitList(SqList &L)//创建线性表函数
{
	L.elem = (ElemType*)malloc(100 * sizeof(ElemType));
	L.Length = 0;
	L.ListSize = 100;
}
void InitData(SqList &L, int length)//初始化元素函数
{
	printf("请输入%d个线性表的元素:\n", length);
	for (int i = 1; i <=length; i++)
	{
		scanf("%d", &L.elem[i]);
	}
	//更改线性表的长度
	L.Length = length;
}

数据打印

void PrintSqList(SqList L) {
	//printf("顺序表为:\n");
	for (int i = 1; i <= L.Length; i++)
	{
		printf("%d\t", L.elem[i]);
	}
	printf("\n");
}

插入排序

void InsertSort(SqList &L) {
	for (int i = 2; i <= L.Length; i++) //从第二个数开始比较
		if (L.elem[i] < L.elem[i-1]) {//如果当前的值,小于前面的值
			L.elem[0] = L.elem[i];//就让当前的那个放在0处,哨兵
			L.elem[i] = L.elem[i - 1];//把前一个的值赋值给当前的值
			int j;
		for (j = i - 2; j > 0 && L.elem[0] < L.elem[j]; j--) 
			L.elem[j + 1] = L.elem[j];
			L.elem[j + 1] = L.elem[0];
	}//if
}

折半排序

void BinSort(SqList &L) {
	for (int i = 2; i <= L.Length; i++) {
		L.elem[0] = L.elem[i];//把第二个作为哨兵
		//下面while类似于折半查找
		int low = 1;
		int high = i - 1;
		int mid;
		while (low <= high) {
			mid = (low + high) / 2;
			if (L.elem[0] < L.elem[mid])
				high = mid - 1;
			else
				low = mid + 1;
		}//while		
		for (int j = i - 1; j >= high + 1; j--) {
			L.elem[j + 1] = L.elem[j];
		}
		L.elem[high + 1] = L.elem[0];
	}
}

希尔排序

void ShellInsert(SqList &L, int dk) {
    
	for (int i = dk + 1; i <= L.Length; i++) 
		if (L.elem[i] < L.elem[i-dk]) {
			L.elem[0] = L.elem[i];
			int j;
			for (j = i - dk; j > 0 && L.elem[0] < L.elem[j]; j -= dk)
				L.elem[j + dk] = L.elem[j];
			L.elem[j + dk] = L.elem[0];
		}
}
void ShellSort(SqList &L, int dlta[], int t) { //传入增量数组
	for (int k = 0; k < t; k++) {
		ShellInsert(L, dlta[k]);
	}
}

快速排序

int Partition(SqList &L, int low, int high) {
	L.elem[0] = L.elem[low];
	int pivokey = L.elem[low];
	while (low < high) {
		while (low < high&&L.elem[high] >= pivokey)--high;
		L.elem[low] = L.elem[high];
		while (low < high&&L.elem[low] <= pivokey)++low;
		L.elem[high] = L.elem[low];
	}
	L.elem[low] = L.elem[0];
	return low;
}
void QSort(SqList &L, int low, int high) {
	if (low < high) {
		int p = Partition(L, low, high);
		QSort(L,low, p - 1);
		QSort(L, p+1, high);
	}
}

选择排序

void SelectSort(SqList &L)
{
	int i = 1;
	for (i = 1; i <= L.Length - 1; i++)
	{
		int j = i;
		int min = i;//记录最小值的下标
		for (j = i + 1; j < L.Length; j++)
		{
			if (L.elem[j] < L.elem[min])
			{
				min = j;
			}
		}
		if (min != i)//将最小值放在正确的位置
		{
			int temp = L.elem[i];
			L.elem[i] = L.elem[min];
			L.elem[min] = temp;
		}

	}
}

主函数

int main(){
	SqList L;
	InitList(L);
	InitData(L,7);
	printf("\n");
	InsertSort(L);
	BinSort(L);
	int data[3] = { 5,3,1 };
	ShellSort(L, data, 3);
	QSort(L, 1, 7);
	SelectSort(L);
	PrintSqList(L);
	system("pause");
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值