/***************************************************/
/* 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);
}
}
三、选择排序法:简单选择排序+堆排序(C语言源代码)
最新推荐文章于 2021-11-18 21:13:07 发布