堆排序(Heap Sort)的C语言实现

堆排序(Heap Sort)具体步骤为

  1. 将无序序列建成大顶堆(小顶堆):从最后一个非叶子节点开始通过堆调整HeapAdjust()变成小顶堆或大顶堆
  2. 将顶部元素与堆尾数组交换,此是末尾元素就是最大值,顶部元素不满足堆,故要将顶部元素在剩余的i-1个元素中调整为堆
  3. 反复第2步。直至所有顶点被输出,序列变成从小到大的有序序列

C语言实现(编译器Dev-c++5.4.0,源代码后缀.cpp)

原创文章,转载请注明来自钢铁侠Mac博客http://www.cnblogs.com/gangtiexia

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #define ERROR -1
 4 #define OK 1
 5 #define TRUE 1
 6 #define MAXSIZE 6
 7 typedef int Status;
 8 typedef int KeyType;
 9 typedef char InfoType;
10
11 typedef struct{
12     KeyType score;
13     InfoType name[20];
14 }RedType;
15
16 typedef struct{
17     RedType r[MAXSIZE+1];
18     int length;
19 }SqList;
20
21 Status initSqList(SqList &l){
22     l.length=MAXSIZE;
23     for(int i=1;i<=l.length;i++){
24         printf("请输入第%d个同学的姓名:",i);
25         scanf("%s",l.r[i].name);
26         printf("请输入第%d个同学的分数:",i);
27         scanf("%d",&(l.r[i].score));
28     }
29     printf("初始化完毕");
30 }
31 /*
32     Name: 堆调整
33     Copyright: http://www.cnblogs.com/gangtiexia
34     Author: 钢铁侠
35     Date: 2015-12-12 21:05:20
36     Description: 参数1为要调整的无序序列,参数2为要调整的数据的位置,参数3为要调整的序列的长度
37 */
38
39 Status HeapAdjust(SqList &l,int m,int n){
40     RedType rc=l.r[m];//rc为要调整的数据
41     int j;
42     for(j=2*m;j<=n;j=j*2){ //接着调整互换下来的l.r[j],l.r[j]也要和他的孩子们满足堆的要求
43         if(j<n&&l.r[j].score<l.r[j+1].score) j++;
44         if(l.r[j].score<rc.score) break; //此时要调整的数据l.rc满足堆的要求,故此数据不进行调整,调整下一个数据。
45         l.r[m]=l.r[j];
46         m=j;
47     } //for循环完毕,m最终定位到rc需要放置的位置
48     l.r[m]=rc;
49 }
50 /*
51     Name: 创建大顶堆+堆排序
52     Copyright: http://www.cnblogs.com/gangtiexia
53     Author: 钢铁侠
54     Date: 2015-12-12 21:05:14
55     Description: 创建堆的过程实质就是堆调整的过程,堆排序实质就是反复将堆的顶部元素移到末尾的过程
56 */
57
58 Status HeapSort(SqList &l){
59     int i;
60     for(i=l.length/2;i>=1;i--){ //从最后一个非叶子节点开始调整每一个子树
61         HeapAdjust(l,i,l.length);
62     }
63     for(i=l.length;i>1;i--)
64     {
65         RedType temp=l.r[1];
66         l.r[1]=l.r[i];
67         l.r[i]=temp;
68         HeapAdjust(l,1,i-1);
69     }
70 }
71
72 Status Traverse(SqList &l){
73     for(int i=1;i<=l.length;i++){
74         printf("\n第%d位同学为%s,分数为%d",i,l.r[i].name,l.r[i].score);
75     }
76 }
77 int main(){
78     SqList L;
79     initSqList(L);
80     HeapSort(L);
81     Traverse(L);
82     return 0;
83 }
时间: 2024-10-11 22:51:46

堆排序(Heap Sort)的C语言实现的相关文章

数据结构 - 堆排序(heap sort) 详解 及 代码(C++)

堆排序(heap sort) 详解 及 代码(C++) 本文地址: http://blog.csdn.net/caroline_wendy 堆排序包含两个步骤: 第一步: 是建立大顶堆(从大到小排序)或小顶堆(从小到大排序), 从下往上建立; 如建堆时, s是从大到小; 第二步: 是依次交换堆顶和堆底, 并把交换后的堆底输出, 只排列剩余的堆, 从上往下建立; 如构造时, s始终是1; 代码: /* * main.cpp * * Created on: 2014.6.12 * Author: S

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

堆排序(heap sort) 具体解释 及 代码(C++) 本文地址: http://blog.csdn.net/caroline_wendy 堆排序包括两个步骤: 第一步: 是建立大顶堆(从大到小排序)或小顶堆(从小到大排序), 从下往上建立; 如建堆时, s是从大到小; 第二步: 是依次交换堆顶和堆底, 并把交换后的堆底输出, 仅仅排列剩余的堆, 从上往下建立; 如构造时, s始终是1; 堆排序(Heap Sort)的时间复杂度是O(nlogn), 最坏情况下也是如此. 而高速排序(Quic

经典排序算法 - 堆排序Heap sort

经典排序算法 - 堆排序Heap sort 堆排序有点小复杂,分成三块 第一块,什么是堆,什么是最大堆 第二块,怎么将堆调整为最大堆,这部分是重点 第三块,堆排序介绍 第一块,什么是堆,什么是最大堆 什么是堆 这里的堆(二叉堆),指得不是堆栈的那个堆,而是一种数据结构. 堆可以视为一棵完全的二叉树,完全二叉树的一个"优秀"的性质是,除了最底层之外,每一层都是满的,这使得堆可以利用数组来表示,每一个结点对应数组中的一个元素. 数组与堆之间的关系 二叉堆一般分为两种:最大堆和最小堆. 什么

堆排序 Heap Sort

堆排序是一种选择排序,其时间复杂度为O(nlogn). 堆的定义 n个元素的序列{k1,k2,…,kn}当且仅当满足下列关系之一时,称之为堆. 情形1:ki <= k2i 且ki <= k2i+1 (最小化堆或小顶堆) 情形2:ki >= k2i 且ki >= k2i+1 (最大化堆或大顶堆) 其中i=1,2,…,n/2向下取整; 若将和此序列对应的一维数组(即以一维数组作此序列的存储结构)看成是一个完全二叉树,则堆的含义表明,完全二叉树中所有非终端结点的值均不大于(或不小于)其左

转载:堆排序 Heap Sort

堆排序是一种选择排序,其时间复杂度为O(nlogn). 堆的定义 n个元素的序列{k1,k2,…,kn}当且仅当满足下列关系之一时,称之为堆. 情形1:ki <= k2i 且ki <= k2i+1 (最小化堆或小顶堆) 情形2:ki >= k2i 且ki >= k2i+1 (最大化堆或大顶堆) 其中i=1,2,…,n/2向下取整; 若将和此序列对应的一维数组(即以一维数组作此序列的存储结构)看成是一个完全二叉树,则堆的含义表明,完全二叉树中所有非终端结点的值均不大于(或不小于)其左

算法分析-堆排序 Heap Sort

堆排序的是集合了插入排序的单数组操作,又有归并排序的时间复杂度,完美的结合了2者的优点. 堆的定义 n个元素的序列{k1,k2,…,kn}当且仅当满足下列关系之一时,称之为堆. 情形1:ki <= k2i 且ki <= k2i+1 (最小化堆或小顶堆) 情形2:ki >= k2i 且ki >= k2i+1 (最大化堆或大顶堆) 其中i=1,2,…,n/2向下取整; 若将和此序列对应的一维数组(即以一维数组作此序列的存储结构)看成是一个完全二叉树,则堆的含义表明,完全二叉树中所有非终

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

堆排序是利用堆进行排序的高效算法,其能实现O(NlogN)的排序时间复杂度,具体算法分析可以点击堆排序算法时间复杂度分析. 算法实现: 调整堆: void sort::sink(int* a, const int root, const int end) { int i=root; while(2*i +1 <= end) { int k = 2*i+1; if(k+1<=end && a[k]<a[k+1]) k++; if(a[k] < a[i]) break;

Java实现---堆排序 Heap Sort

堆排序与快速排序,归并排序一样都是时间复杂度为O(N*logN)的几种常见排序方法.学习堆排序前,先讲解下什么是数据结构中的二叉堆. 堆的定义 n个元素的序列{k1,k2,…,kn}当且仅当满足下列关系之一时,称之为堆. 情形1:ki <= k2i 且ki <= k2i+1 (最小化堆或小顶堆) 情形2:ki >= k2i 且ki >= k2i+1 (最大化堆或大顶堆) 其中i=1,2,…,n/2向下取整; 若将和此序列对应的一维数组(即以一维数组作此序列的存储结构)看成是一个完全

堆排序Heap sort

堆排序有点小复杂,分成三块 第一块,什么是堆,什么是最大堆 第二块,怎么将堆调整为最大堆,这部分是重点 第三块,堆排序介绍 第一块,什么是堆,什么是最大堆 什么是堆 这里的堆(二叉堆),指得不是堆栈的那个堆,而是一种数据结构. 堆可以视为一棵完全的二叉树,完全二叉树的一个“优秀”的性质是,除了最底层之外,每一层都是满的,这使得堆可以利用数组来表示,每一个结点对应数组中的一个元素. 数组与堆之间的关系 二叉堆一般分为两种:最大堆和最小堆. 什么是最大堆 堆中每个父节点的元素值都大于等于其孩子结点(

[Unity][Heap sort]用Unity动态演示堆排序的过程

[Unity][Heap sort]用Unity动态演示堆排序的过程 How Heap Sort Works 最近做了一个用Unity3D动态演示堆排序过程的程序. I've made this heap sort demo to show how heap sort works recently. 效果图(Demo) 一图抵千言. A picture paints a thousand words. 您可以在此查看完整的动态GIF效果图.博客园里放不下这么大的GIF图. 链接:http://p