4.5 堆排序法

4-5 HeapSort.c

 1 #include <stdio.h>
 2 #include "4-1 CreateData.c"
 3 #define ARRAYLEN 10
 4 void HeapAdjust(int a[],int s,int n)//构成堆
 5 {
 6     int j,t;
 7     while(2*s+1<n) //第s个结点有右子树
 8     {
 9         j=2*s+1 ;
10         if((j+1)<n)
11         {
12             if(a[j]<a[j+1])//右左子树小于右子树,则需要比较右子树
13                 j++; //序号增加1,指向右子树
14         }
15         if(a[s]<a[j])//比较s与j为序号的数据
16         {
17             t=a[s];  //交换数据
18             a[s]=a[j];
19             a[j]=t;
20             s=j ;//堆被破坏,需要重新调整
21         }
22         else //比较左右孩子均大则堆未破坏,不再需要调整
23             break;
24     }
25 }
26 void HeapSort(int a[],int n)//堆排序
27 {
28     int t,i;
29     int j;
30     for(i=n/2-1;i>=0;i--)    //将a[0,n-1]建成大根堆
31         HeapAdjust(a, i, n);
32     for(i=n-1;i>0;i--)
33     {
34         t=a[0];//与第i个记录交换
35         a[0] =a[i];
36         a[i] =t;
37         HeapAdjust(a,0,i);        //将a[0]至a[i]重新调整为堆
38     }
39 }
40 int main()
41 {
42     int i,a[ARRAYLEN];
43     for(i=0;i<ARRAYLEN;i++)
44         a[i]=0;
45     if(!CreateData(a,ARRAYLEN,1,100))
46     {
47         printf("生成随机数不成功!\n");
48         getch();
49         return 1;
50     }
51     printf("原数据:");
52     for(i=0;i<ARRAYLEN;i++)
53         printf("%d ",a[i]);
54     printf("\n");
55     HeapSort(a,ARRAYLEN);
56     printf("排序后:");
57     for(i=0;i<ARRAYLEN;i++)
58         printf("%d ",a[i]);
59     printf("\n");
60     getch();
61     return 0;
62 }
时间: 2024-11-03 22:44:38

4.5 堆排序法的相关文章

排序算法: 堆排序法

一,使用堆排序法之前,需要了解堆的特性: 1,堆一般都用数组的方式来存储,堆分为“最大堆”和“最小堆”: 2,以“最大堆”为例: (1)一个节点最多有两个子节点,即左右节点,每个节点都是一个堆: (2)父节点的值不小于子节点的值: (3)一个i节点,其父节点为(i-1)/2,左节点(2*i+1),右节点(2*i+2) 一个最大堆例子: 数组 int a[]: 83 78 81 48 17 27 二,将一个数组形成堆(以最大堆为例) 数组a[]: 27 48 81 78 17 83 形成最大堆思路

POJ-1002: 487-3279 详解1: 堆排序法

> 分析 >> 本题的难点在于排序速度上 >> 排序算法要考虑重复项很多,无重复项两种情况 >> 当然由于本题对内存占用的要求不高,也可以不使用排序 > 总体思路 >> 先将电话号码按输入的顺序存下来 >> 对所有号码使用堆排序 >> 排序后根据号码连续出现的频率输出频率大于1的号码 > 输入转换 >> 本题中已详细定义了字母到数字的映射,因此推荐使用映射表较快 > 存储形式 >> 由于

让算法会说话之堆排序

转载请注明出处:http://blog.csdn.net/ruoyunliufeng/article/details/26364047        堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法.堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点. 一.堆的删除 虽然在这里我默认读者对"堆"是有所了解的,但是这里我仍然要讲一下堆的删除,因为这直接影响你对下面堆排序的理解. 这里以删除最小元为例讲解,当然下面的

java几种常见的排序算法总结

[java] view plain copy /*************几种常见的排序算法总结***************************/ package paixu; public class PaiXu { final int MAX=20; int num[]=new int[MAX]; { System.out.print("生成的随机数组是:"); for(int i=0;i<20;i++){ num[i]=(int)(Math.random()*100)

php面试题汇总四(基础篇附答案)

1. 什么事面向对象?主要特征是什么? 面向对象是程序的一种设计方式,它利于提高程序的重用性,使程序结构更加清晰.主要特征:封装.继承.多态. 2. SESSION 与 COOKIE的区别是什么,请从协议,产生的原因与作用说明? 1.http无状态协议,不能区分用户是否是从同一个网站上来的,同一个用户请求不同的页面不能看做是同一个用户. 2.SESSION存储在服务器端,COOKIE保存在客户端.Session比较安全,cookie用某些手段可以修改,不安全.Session依赖于cookie进行

计算机查找和排序

查找技术:1,顺序查找,N次. 2,二分查找(只适用于顺序存储的有序线性表),log2^n次. 排序技术:1,交换类排序:a,冒泡排序法N(n-1)/2.b,快速排序法N(n-1)/2. 2,插入类排序法:a,简单插入排序法N(n-1)/2.b,希尔排序法nlog2^n. 3,选择类排序法:a,简单选择排序法N(n-1)/2.b,堆排序法nlog2^n.

几种常见的排序算法Java实现总结

public class MySort { final int MAX=20; int num[]=new int[MAX]; { System.out.print("生成的随机数组是:"); for(int i=0;i<20;i++){ num[i]=(int)(Math.random()*100); System.out.print(num[i]+" "); } System.out.println(); } int num2[]=new int[MAX]

数组常见的操作_选择排序

排序分类:       内部排序:就是将需要处理的所有数据都加载到内部存储器中进行排序                交换式排序法:是运用数值较后,依判断规则对数据位置进行交换,以达到排序的目的                    冒泡排序法(Bubble Sort)                    快速排序法(Quick Sort)                选择式排序法:                     选择排序法(Select Sort)                

Java数据结构面试题

1.栈和队列的共同特点是(只允许在端点处插入和删除元素) 4.栈通常采用的两种存储结构是(线性存储结构和链表存储结构) 5.下列关于栈的叙述正确的是(D)      A.栈是非线性结构B.栈是一种树状结构C.栈具有先进先出的特征D.栈有后进先出的特征 6.链表不具有的特点是(B)A.不必事先估计存储空间       B.可随机访问任一元素 C.插入删除不需要移动元素      D.所需空间与线性表长度成正比 7.用链表表示线性表的优点是(便于插入和删除操作) 8.在单链表中,增加头结点的目的是(