堆排序 C语言实现

堆排序

(Heap Sort) 是一种树形选择排序,在排序过程中,将待排序的记录Data[1…n]看成是一棵完全二叉树的顺序存储结构,利用完全二叉树中双亲结点和孩 子结点之间的内在关系,在当前无序的序列中选择关键字最大(或最小)的记录。

时间复杂度

O(n l o g 2 log_2 log2n)

空间复杂度

O(1)

算法特点:

1 ) 是不稳定排序。
2 ) 只能用于顺序结构,不能用于链式结构。
3 ) 初始建堆所需的比较次数较多,因此记录数较少时不宜采用。堆排序在最坏情况下时间复杂度为O(nlog2n),相对于快速排序最坏情况下的O(n2)而言是一个优点, 当记录较多时较为高效。

完整代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXSIZE 100  //顺序表最大容量,可以自行加大 

typedef struct 
{
	int key;//关键字项 
	char *otherinfo;//其他数据项 
}ElemType;//记录类型 
typedef struct
{
	ElemType Data[MAXSIZE+1];//静态顺序表的数据域,这里Data[0]为空闲或者为哨兵单元 
	int length;//顺序表的长度 
}SqList;//顺序表 

void InitList(SqList &L)//顺序表的初始化 
{
	L.length = 0;//使顺序表长度归0,便是顺序表的初始化 
}

void CreateList(SqList &L)//顺序表的创建 
{
	printf("请输入:"); 
	while(1)//建立一个死循环,循环终止条件是按了enter键 
	{
		L.length++;//顺序表长度加一 
		if(L.length>MAXSIZE)//判断是否超出最大容纳量 
		{
			printf("顺序表已满!\n");
			return ;
		}
		scanf("%d",&L.Data[L.length].key);//顺序表数据的输入 
		if(getchar() == '\n')//循环终止条件 
			break;
	}
}

void InputList(SqList L)//顺序表的输出 
{
	int i;//记录次数 
	if(L.length == 0)//判断顺序表是否为空 ,若为空结束该函数 
	{
		printf("顺序表是空的!\n");
		return ;
	}
	printf("打印为:");
	for(i=1;i<=L.length;i++)//利用循环打印顺序表中的数据 
		printf("%d ",L.Data[i].key);	
}

void HeapAdjust(SqList &L,int s,int m)//假设Data[s+1…m]已是堆,将Data[s…m]调整为以Data[s]为根的大根堆 
{//筛选法调整堆 
	int j;
	L.Data[0] = L.Data[s];
	for(j=2*s;j<=m;j*=2)//沿key较大的孩子结点向下筛选 
	{
		if(j<m&&L.Data[j+1].key > L.Data[j].key)//j为key较大的记录的下标 
			j++;
		if(L.Data[0].key >= L.Data[j].key)//Data[0]应插入在位置s上 
			break;
		L.Data[s] = L.Data[j];
		s = j;
	}
	L.Data[s] = L.Data[0];//插入 
}
void CreatHeap(SqList &L)//建初堆,把无序序列L.Data[1…n]建成大根堆 
{
	int i;
	for(i=L.length/2;i>0;i--)//反复调用HeapAdjust 
		HeapAdjust(L,i,L.length);
}
void HeapSort(SqList &L)//对顺序表L进行堆排序 
{
	int i;
	CreatHeap(L);//把无序序列L.Data[1…L.length]建成大根堆 
	for(i=L.length;i>1;i--)
	{
		L.Data[0] = L.Data[1];//将堆顶记录和当前未经排序子序列L.Data[1…i]中最后一个记录互换 
		L.Data[1] = L.Data[i];
		L.Data[i] = L.Data[0];
		HeapAdjust(L,1,i-1);//将L.Data[1…i-1]重新调整为大根堆 
	}
}

int main()
{
	SqList L;
	InitList(L);//初始化顺序表 
	CreateList(L);//创建顺序表 
	HeapSort(L);//堆排序 
	InputList(L);//打印排序后结果 
	return 0;
}

在这里插入图片描述
(完)


http://www.niftyadmin.cn/n/1580148.html

相关文章

学习----生活---追寻梦-------

来Lamp兄弟连算下来也有半个月了&#xff0c;对于Lamp这个概念也由当初的陌生变得熟悉起来……更对39期的兄弟当然还有我们班出了名的Shero们啊&#xff01;都变得熟悉起来…..见面总会少不了的hello&#xff0c;少不了的hi…..我英语不好啊~好的话来点英语挺美的。。。呵呵呵。…

归并排序 C语言实现

归并排序 ( Merging Sort )就是将两个或两个以上的有序表合并成一-个有序表的过程。将两个有序表合并成个有序表的过程称为2-路归并&#xff0c;2-路归并最为简单和常用。 算法思想&#xff1a; 假设初始序列含有n个记录&#xff0c;则可看成是n个有序的子序列&#xff0c;每…

资源下载--持续更新中......

下载目录说明&#xff08;如果使用ctrlf查询相应的关键字&#xff09; 一.系统下载 二.LAMP,LNMP软件下载 三.负载均衡软件下载 四.监控软件下载 五.管理软件下载 下面的这个资源连接是存放在我‘云端’的&#xff0c;大家可以直接上去拿 http://sdrv.ms/LnKFi3 &#xff08;如…

java学习笔记(1)--win7 java环境的搭建

java的学习笔记&#xff08;一&#xff09; 搭建java环境 1.下载一个安装程序 需下载一个jdk安装包&#xff0c;JDK&#xff1a;Java开发员的软件开发工具包。 官网网址 https://www.oracle.com/java/technologies/javase-downloads.html 也可以在百度上直接搜。&#xff08…

WSDL文件生成WEB service server端C#程序

一般一个已经实现功能的WEB Server会发布自己的WSDL文件&#xff0c;供客户端生成代理类。 但有时是先有的server与client交互的接口定义&#xff08;WSDL&#xff09;文件&#xff0c;然后由server和client端分别写程序&#xff0c;一个提供web服务&#xff0c;一个使用web服…

java学习笔记(2)--hello world

java编写一段java源代码 一、新建一个java文档&#xff08;这里用记事本来写&#xff09; 首先创建一个文本&#xff1a; 然后将文本后缀更改为.java 如果不显示后缀名字&#xff0c;这里以我的电脑为例 二、用记事本打开新建的java文件&#xff0c;并写入代码&#xff0…

正则表达式替换器 RegeX 3 发布 (Silverlight版)

继上一版本RegeX发布以来已有三年多了&#xff0c;此次发布全新设计的RegeX 3供广大开发者使用。 新版基于Silverlight开发&#xff0c;支持安装到本地运行&#xff0c;采用类似WindowsPhone7的Metro风格设计。 新版本的主打功能有两点&#xff1a; 支持无限层级的复杂多重匹配…

java学习笔记--基本数据类型

java数据类型 基本数据类型 一、整型 &#xff08;1&#xff09;byte字节型 所占内存&#xff1a;8bit&#xff08;1字节&#xff09; 0 0000000 1字节&#xff08;byte&#xff09; 8比特&#xff08;bit&#xff09; 用第一个bit位置来记录符号&#xff0c;0表示正数&am…