数据结构之选择排序·堆排序

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_36880027/article/details/100153908

选择排序的原始思路是不断选择出最小值,构成新的数组,和冒泡排序差不多。如此一来,排序的大量时间都是在查找最小值。

堆排序就是在简单选择排序的思路上进行改进的,它大大减少了查找最小值所需要的时间。在使用堆排序时,首先构造一个大根堆,即一个任意节点的值比左右孩子节点的值大的满二叉树。构造这一棵二叉树的过程称为调整或筛选。

参考视频:

李春葆:《数据结构》
https://www.icourse163.org/learn/WHU-1001539003?tid=1002049010#/learn/content?type=detail&id=1002711948

测试代码:

//希尔排序
#include <stdio.h>
#include <stdlib.h>

#define MAXSIZE 20

typedef struct{ //记录类型 
	int key;    //关键字 
	char data;  //数据
}record;

typedef struct{
	record rec[MAXSIZE+1]; //包含MAXSIZE+1个记录,记录0是哨兵,相当于tmp 
	int length;            //顺序表的长度 
}sqList;

void heapAdjust(sqList *L,int s,int m);
void heapSort(sqList *L);

int main()
{
	sqList L; 
	L.length = MAXSIZE; 
	
	//使用随机数据初始化sqList中的数据
	for(int i = 1;i<=L.length;i++)  
	{
		L.rec[i].key = rand()%17;
		L.rec[i].data = 'a' + L.rec[i].key; 
	}
	
	//输出排序前的记录 
	for(int i = 1;i<=L.length;i++)
		printf("record %2d: key = %2d, data = %c\n",i,L.rec[i].key,L.rec[i].data);
	
	//希尔排序
	heapSort(&L);
	
	//输出排序后的记录 
	printf("\n------>堆排序后<------\n");
	for(int i = 1;i<=L.length;i++)
		printf("record %2d: key = %2d, data = %c\n",i,L.rec[i].key,L.rec[i].data);
	
	return 1;
} 

//大根堆调整函数
void heapAdjust(sqList *L,int s,int m)
{
	record rc;
	rc = L->rec[s];
	for(int j = 2*s;j<=m;j *= 2)
	{
		if(j<m && L->rec[j].key<L->rec[j+1].key) ++j;
		if(rc.key>L->rec[j].key) break;
		L->rec[s] = L->rec[j]; s = j;
	}
	L->rec[s] = rc;
} 

//堆排序
void heapSort(sqList *L)
{
	for(int i = L->length/2;i>0;i--)
		heapAdjust(L,i,L->length);
	for(int i = L->length;i>1;--i)
	{
		L->rec[0] = L->rec[1];
		L->rec[1] = L->rec[i];
		L->rec[i] = L->rec[0];
		heapAdjust(L,1,i-1);
	}
} 

运行结果:

record  1: key =  7, data = h
record  2: key =  5, data = f
record  3: key = 10, data = k
record  4: key = 14, data = o
record  5: key = 10, data = k
record  6: key = 16, data = q
record  7: key =  3, data = d
record  8: key = 16, data = q
record  9: key =  0, data = a
record 10: key =  1, data = b
record 11: key = 10, data = k
record 12: key = 10, data = k
record 13: key =  8, data = i
record 14: key = 14, data = o
record 15: key = 16, data = q
record 16: key = 15, data = p
record 17: key =  3, data = d
record 18: key =  8, data = i
record 19: key = 16, data = q
record 20: key = 13, data = n

------>堆排序后<------
record  1: key =  0, data = a
record  2: key =  1, data = b
record  3: key =  3, data = d
record  4: key =  3, data = d
record  5: key =  5, data = f
record  6: key =  7, data = h
record  7: key =  8, data = i
record  8: key =  8, data = i
record  9: key = 10, data = k
record 10: key = 10, data = k
record 11: key = 10, data = k
record 12: key = 10, data = k
record 13: key = 13, data = n
record 14: key = 14, data = o
record 15: key = 14, data = o
record 16: key = 15, data = p
record 17: key = 16, data = q
record 18: key = 16, data = q
record 19: key = 16, data = q
record 20: key = 16, data = q

--------------------------------
Process exited after 0.07437 seconds with return value 1
请按任意键继续. . .

猜你喜欢

转载自blog.csdn.net/qq_36880027/article/details/100153908