三、选择排序法:简单选择排序+堆排序(C语言源代码)

/***************************************************/
/*    Description:三、选择排序法:简单选择排序+堆排序(C语言源代码)
/*    Date:2021/9/18
/*    Author:汝南城
/****************************************************/
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 1000

/*交换排序算法基于的顺序表存储结构*/
typedef int KeyType;
typedef struct {
	KeyType key;
	char name[10];//other info
}RedType;

typedef struct {
	RedType r[MAXSIZE + 1];
	int length;
}SqList;

/*①简单选择排序*/
void Simple_Select_Sort(SqList *L)
{
	int i, j,k;
	RedType temp;
	for (i = 1; i <= L->length; i++)
	{
		k = i;
		for (j = i + 1; j <= L->length; j++)
		{
			if (L->r[j].key < L->r[k].key)
			{
				k = j;     /*k记录最小值,升序*/
			}
			if (k != i)
			{
				temp = L->r[k];
				L->r[k] = L->r[i];
				L->r[i]=temp;

			}
		}
	}
}

/*②堆排序_筛选法调整堆*/
void Heap_Adjust(SqList* L,int s,int j)
{
	/*假设r[s+1...m]已经是堆,将r[s...m]调整为以r[s]为根的大根堆*/
	int m = L->length;
	RedType 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;} /*判断以r[s]为根的子树是否为堆*/
		L->r[s] = L->r[j]; s = j;           /*不是堆,需要调整*/
	}
	L->r[s] = rc;
}

/*③堆排序_建立堆*/
void Create_Heap(SqList* L)
{
	int n = L->length;
	int i;
	for (i = n / 2; i > 0; --i)
	{
		Heap_Adjust(L,i,n);
	}
}

/*④堆排序*/
void Heap_Sort(SqList* L)
{
	int i;
	Create_Heap(L);
	for (i=L->length; i > 1; i--)
	{
		RedType temp;
		temp = L->r[1];
		L->r[1] = L->r[i];
		L->r[i]=temp;
		Heap_Adjust(L,1,i-1);
	}

}


void main()
{
	SqList* L1 = (SqList*)malloc(sizeof(SqList));

	RedType i;
	L1->length = 0;
	for (i.key = 100; i.key > 90; i.key--)
	{
		L1->r[101 - i.key].key = 101-i.key;
		L1->length++;
	}

	for (int j = 1; j <= 10; j++)
	{
		printf("%d ", L1->r[j].key);
	}
	printf("\n");
	

	//Simple_Select_Sort(L1);

	Heap_Sort(L1);

	for (int j = 1; j <= 10; ++j)
	{
		printf("%d ", L1->r[j].key);
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值