堆排序(Heap Sort)具体步骤为
  1. 将无序序列建成大顶堆(小顶堆):从最后一个非叶子节点开始通过堆调整HeapAdjust()变成小顶堆或大顶堆
  2. 将顶部元素与堆尾数组交换,此是末尾元素就是最大值,顶部元素不满足堆,故要将顶部元素在剩余的i-1个元素中调整为堆
  3. 反复第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语言实现的更多相关文章

  1. 数据结构 - 堆排序(heap sort) 具体解释 及 代码(C++)

    堆排序(heap sort) 具体解释 及 代码(C++) 本文地址: http://blog.csdn.net/caroline_wendy 堆排序包括两个步骤: 第一步: 是建立大顶堆(从大到小排 ...

  2. Python入门篇-数据结构堆排序Heap Sort

    Python入门篇-数据结构堆排序Heap Sort 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.堆Heap 堆是一个完全二叉树 每个非叶子结点都要大于或者等于其左右孩子结点 ...

  3. 堆排序 Heap Sort

    堆排序虽然叫heap sort,但是和内存上的那个heap并没有实际关系.算法上,堆排序一般使用数组的形式来实现,即binary heap. 我们可以将堆排序所使用的堆int[] heap视为一个完全 ...

  4. 算法----堆排序(heap sort)

    堆排序是利用堆进行排序的高效算法,其能实现O(NlogN)的排序时间复杂度,详细算法分析能够点击堆排序算法时间复杂度分析. 算法实现: 调整堆: void sort::sink(int* a, con ...

  5. 堆排序Heap sort

    堆排序有点小复杂,分成三块 第一块,什么是堆,什么是最大堆 第二块,怎么将堆调整为最大堆,这部分是重点 第三块,堆排序介绍 第一块,什么是堆,什么是最大堆 什么是堆 这里的堆(二叉堆),指得不是堆栈的 ...

  6. Java实现---堆排序 Heap Sort

    堆排序与快速排序,归并排序一样都是时间复杂度为O(N*logN)的几种常见排序方法.学习堆排序前,先讲解下什么是数据结构中的二叉堆. 堆的定义 n个元素的序列{k1,k2,…,kn}当且仅当满足下列关 ...

  7. 小小c#算法题 - 7 - 堆排序 (Heap Sort)

    在讨论堆排序之前,我们先来讨论一下另外一种排序算法——插入排序.插入排序的逻辑相当简单,先遍历一遍数组找到最小值,然后将这个最小值跟第一个元素交换.然后遍历第一个元素之后的n-1个元素,得到这n-1个 ...

  8. 数据结构与算法---堆排序(Heap sort)

    堆排序基本介绍 1.堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序. 2.堆是具有以下性质的完全二叉树:每个 ...

  9. [Unity][Heap sort]用Unity动态演示堆排序的过程(How Heap Sort Works)

    [Unity][Heap sort]用Unity动态演示堆排序的过程 How Heap Sort Works 最近做了一个用Unity3D动态演示堆排序过程的程序. I've made this ap ...

随机推荐

  1. eclipse下开发简单的Web Service

    service部分 在eclipse下新建一个动态web项目 在项目中新建一个service类 编写SayHello类的代码 package org.sunny.service; //包不要引用错了 ...

  2. C#中格式化数据的输出

    格式项都采用如下形式: {index[,alignment][:formatString]} 其中"index"指索引占位符,这个肯定都知道: ",alignment&q ...

  3. MySQL更新时Error Code:1093和Error Code:1175的解决办法

    Error Code: 1093. You can't specify target table 'ws_product' for update in FROM clause 这个是我们在使用upda ...

  4. leetcode第一刷_Construct Binary Tree from Preorder and Inorder Traversal

    构造方式跟中序与后序全然一样,并且一般都习惯正着来,所以更简单. 代码是之前写的,没实用库函数,不应该. TreeNode *buildIt(vector<int> &preord ...

  5. Eclipse混淆文件导入Android Studio Gradle编译报input jar file is specified twice

    Eclipse项目中的混淆配置文件 复制到AS中 在混淆的过程中提示如下错误     Error:Execution failed for task ':app:proguardDemoRelease ...

  6. iOS图片拉伸

    常用的图片拉伸场景有:聊天页面的气泡,需要根据内容拉伸,但圆角拉伸后会变形,为避免圆角拉伸,可以指定拉伸区域.UIImage实体调用以下方法即可指定拉伸区域. - (UIImage *)stretch ...

  7. State 状态模式

    简介 状态模式允许一个对象在其内部[状态]改变的时候改变其[行为].这个对象看上去就像是改变了它的类一样. 用一句话来表述,状态模式把所研究的对象的[行为]包装在不同的[状态对象]里,[每一个状态对象 ...

  8. python文档字符串

    #coding=utf-8 #文档字符串def d(i,j): """这个函数实现了一个乘法运算. 函数会返回一个乘法运算的结果.""" k ...

  9. response.setContentType()的作用及参数

    package com.java1234.util; import java.io.PrintWriter; import javax.servlet.http.HttpServletResponse ...

  10. sql查阅每一月的数据

    因为项目中需要做数据报表的功能,需要统计每个月的销售额.我找到下面的sql语句.后来经过自己的测试,发现第二句才是可以用的, //String sql="SELECT year(buydat ...