堆排序(Heap Sort)的C语言实现
- 将无序序列建成大顶堆(小顶堆):从最后一个非叶子节点开始通过堆调整HeapAdjust()变成小顶堆或大顶堆
- 将顶部元素与堆尾数组交换,此是末尾元素就是最大值,顶部元素不满足堆,故要将顶部元素在剩余的i-1个元素中调整为堆
- 反复第2步。直至所有顶点被输出,序列变成从小到大的有序序列
C语言实现(编译器Dev-c++5.4.0,源代码后缀.cpp)
原创文章,转载请注明来自钢铁侠Mac博客http://www.cnblogs.com/gangtiexia
#include <stdio.h>
#include <stdlib.h>
#define ERROR -1
#define OK 1
#define TRUE 1
#define MAXSIZE 6
typedef int Status;
typedef int KeyType;
typedef char InfoType; typedef struct{
KeyType score;
InfoType name[];
}RedType; typedef struct{
RedType r[MAXSIZE+];
int length;
}SqList; Status initSqList(SqList &l){
l.length=MAXSIZE;
for(int i=;i<=l.length;i++){
printf("请输入第%d个同学的姓名:",i);
scanf("%s",l.r[i].name);
printf("请输入第%d个同学的分数:",i);
scanf("%d",&(l.r[i].score));
}
printf("初始化完毕");
}
/*
Name: 堆调整
Copyright: http://www.cnblogs.com/gangtiexia
Author: 钢铁侠
Date: 2015-12-12 21:05:20
Description: 参数1为要调整的无序序列,参数2为要调整的数据的位置,参数3为要调整的序列的长度
*/ Status HeapAdjust(SqList &l,int m,int n){
RedType rc=l.r[m];//rc为要调整的数据
int j;
for(j=*m;j<=n;j=j*){ //接着调整互换下来的l.r[j],l.r[j]也要和他的孩子们满足堆的要求
if(j<n&&l.r[j].score<l.r[j+].score) j++;
if(l.r[j].score<rc.score) break; //此时要调整的数据l.rc满足堆的要求,故此数据不进行调整,调整下一个数据。
l.r[m]=l.r[j];
m=j;
} //for循环完毕,m最终定位到rc需要放置的位置
l.r[m]=rc;
}
/*
Name: 创建大顶堆+堆排序
Copyright: http://www.cnblogs.com/gangtiexia
Author: 钢铁侠
Date: 2015-12-12 21:05:14
Description: 创建堆的过程实质就是堆调整的过程,堆排序实质就是反复将堆的顶部元素移到末尾的过程
*/ Status HeapSort(SqList &l){
int i;
for(i=l.length/;i>=;i--){ //从最后一个非叶子节点开始调整每一个子树
HeapAdjust(l,i,l.length);
}
for(i=l.length;i>;i--)
{
RedType temp=l.r[];
l.r[]=l.r[i];
l.r[i]=temp;
HeapAdjust(l,,i-);
}
} Status Traverse(SqList &l){
for(int i=;i<=l.length;i++){
printf("\n第%d位同学为%s,分数为%d",i,l.r[i].name,l.r[i].score);
}
}
int main(){
SqList L;
initSqList(L);
HeapSort(L);
Traverse(L);
return ;
}
堆排序(Heap Sort)的C语言实现的更多相关文章
- 数据结构 - 堆排序(heap sort) 具体解释 及 代码(C++)
堆排序(heap sort) 具体解释 及 代码(C++) 本文地址: http://blog.csdn.net/caroline_wendy 堆排序包括两个步骤: 第一步: 是建立大顶堆(从大到小排 ...
- Python入门篇-数据结构堆排序Heap Sort
Python入门篇-数据结构堆排序Heap Sort 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.堆Heap 堆是一个完全二叉树 每个非叶子结点都要大于或者等于其左右孩子结点 ...
- 堆排序 Heap Sort
堆排序虽然叫heap sort,但是和内存上的那个heap并没有实际关系.算法上,堆排序一般使用数组的形式来实现,即binary heap. 我们可以将堆排序所使用的堆int[] heap视为一个完全 ...
- 算法----堆排序(heap sort)
堆排序是利用堆进行排序的高效算法,其能实现O(NlogN)的排序时间复杂度,详细算法分析能够点击堆排序算法时间复杂度分析. 算法实现: 调整堆: void sort::sink(int* a, con ...
- 堆排序Heap sort
堆排序有点小复杂,分成三块 第一块,什么是堆,什么是最大堆 第二块,怎么将堆调整为最大堆,这部分是重点 第三块,堆排序介绍 第一块,什么是堆,什么是最大堆 什么是堆 这里的堆(二叉堆),指得不是堆栈的 ...
- Java实现---堆排序 Heap Sort
堆排序与快速排序,归并排序一样都是时间复杂度为O(N*logN)的几种常见排序方法.学习堆排序前,先讲解下什么是数据结构中的二叉堆. 堆的定义 n个元素的序列{k1,k2,…,kn}当且仅当满足下列关 ...
- 小小c#算法题 - 7 - 堆排序 (Heap Sort)
在讨论堆排序之前,我们先来讨论一下另外一种排序算法——插入排序.插入排序的逻辑相当简单,先遍历一遍数组找到最小值,然后将这个最小值跟第一个元素交换.然后遍历第一个元素之后的n-1个元素,得到这n-1个 ...
- 数据结构与算法---堆排序(Heap sort)
堆排序基本介绍 1.堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序. 2.堆是具有以下性质的完全二叉树:每个 ...
- [Unity][Heap sort]用Unity动态演示堆排序的过程(How Heap Sort Works)
[Unity][Heap sort]用Unity动态演示堆排序的过程 How Heap Sort Works 最近做了一个用Unity3D动态演示堆排序过程的程序. I've made this ap ...
随机推荐
- USACO月赛数据
终于找到了usaco月赛的数据…… 根据月赛的名称,我们可以写出数据地址.比如08年一月的月赛即是:http://contest.usaco.org/JAN08 这里要注意区分大小写.
- 如何在COM的IDL文件中include头文件?
可以使用import语句,如import "x.h"; 则在自动生成的xxx_i.h中将会有include "x.h", 于是x.h就被include到工程中了 ...
- Java父类子类的对象初始化过程
摘要 Java基本的对象初始化过程,子类的初始化,以及涉及到父类和子类的转化时可能引起混乱的情况. 1. 基本初始化过程: 对于一个简单类的初始化过程是: static 修饰的模块(static变量和 ...
- 七牛云- Java 端 使用
项目 中需要把 图片放到 图片服务器上托管, 所以使用了七牛, 注册之后每个月 有免费100 万 次get请求,先说说怎么使用: 1 .注册, 获取自己的AK,SK
- MVC 无法将类型“System.Collections.Generic.List<AnonymousType#1>”隐式转换为“System.Collections.Generic.IList<Mvc3Modeltest.Models.Movie>”。存在一个显式转换(是否缺少强制转换?))
1.问题: 2.解决方案:强制指定类型. 解决之.
- static对象的高级用法
1. 函数里static对象是local的,其他如全局对象,类里的static对象都是非local的,会在程序初始化中提前创建 2. 非local的对象的创建无法确定先后次序,但能保证在main函数前 ...
- Creating a Background Service ——IntentService
The IntentService class provides a straightforward structure for running an operation on a single ba ...
- yii redirect
redirect 这个方法是在 CController 里定义的 先来看下官方介绍 redirect() 方法 public void redirect(mixed $url, boolean $te ...
- RHEL7下PXE+Apache+Kickstart无人值守安装操作系统
RHEL7下PXE+Apache+Kickstart无人值守安装操作系统 1.配置yum源 vim /etc/yum.repos.d/development.repo [development] na ...
- python实现登录函数,比较简单
一个简单的python实现登录以及修改密码的函数 #密码错误3次,锁定登录: password_list = ['] def account_login(): Tries = 3 while Trie ...