首页 > 代码库 > 数据结构之堆排序

数据结构之堆排序

堆排序,是数据结构中重要的排序方法,可以很快帮你找到最大值。在实际应用中,如 最大优先级队列是大顶推的应用,可以很快找到优先级最高的队列。

1.堆概念

堆的定义如下,n个元素的序列{k1,k2,...kn},当且仅当满足如下关系:

ki>=k2i               或者         ki<=k2i

ki>=k2i+1                          ki<=k2i+1

分别对应大顶堆和小顶堆。

堆可以看作一个完全二叉树,所有非终端点都大于或都小于左右孩子,且堆顶数据是最大或最小值。

2.堆排序主要解决问题

堆排序要将无规律的数据排列成一个大顶堆或者小顶堆;如何在删去堆顶后,如何重新调整使它重新变成堆。

3.堆排序

堆排序是反复"筛选"的过程。

在建立堆时,如果将序列看出完全二叉树,那么最好一个非终端点一定【n/2】位置,从该位置开始往前调整。

排序过程,每次用序列最后一个数与堆顶交换,然后对剩下的n-1进行一次调整,依次进行。

4.堆排序代码

 1 #include <stdio.h> 2 #include <stdlib.h> 3  4 #define INIT  1000 5 #define INCRENMENT 1000 6  7  8 //顺序列表结构体 9 typedef struct List{10     int *elem;//基地址11     int length;//顺序列表的长度12     int size;//总长度13 }List;14 //列表初始化15 void init(List &L)16 {17     L.elem=(int*)malloc(sizeof(int)*INIT);18     L.length=0;19     L.size=INIT;20 }21 //显示列表数据22 void print(List L)23 {24     for(int i=1;i<=L.length;i++)25         printf("%d\t",L.elem[i]);26     printf("\n");27 28 }29 //插入新数据30 void insert(List &L,int i)31 {32     if(L.length>=L.size)33     {34         L.elem=(int*)realloc(L.elem,sizeof(int)*(L.size+INCRENMENT));35         if(!L.elem) exit(-1);36         L.size+=INCRENMENT;37     }38     L.elem[++L.length]=i;39     //printf("%d插入完毕\n",i);40 41 }42 //堆调整  本来调整大顶堆43 void HeapAdjust(List &L,int s,int m)44 {45     int temp=L.elem[s];46 47     for(int j=2*s;j<=m;j*=2)48     {49         if(j<m && L.elem[j]<L.elem[j+1]) j++;50         if(temp > L.elem[j]) break;51         L.elem[s]=L.elem[j];52         s=j;53     }54 55     L.elem[s]=temp;56 }57 //堆排序58 void HeapSort(List &L)59 {60     //堆建立61     for(int i=L.length/2;i>0;i--)62     {63        HeapAdjust(L,i,L.length);64     }65 66     //堆排序67     for(int j=L.length;j>0;j--)68     {   //将堆顶和最后一个数据交换69         int temp=L.elem[j];70         L.elem[j]=L.elem[1];71         L.elem[1]=temp;72         HeapAdjust(L,1,j-1);73     }74 }75 int main()76 {77     List L;78     init(L);79     for(int i=1;i<=10;i++){80         insert(L,rand()%1000);81     }82     printf("初始化10个随机数据\n");83     print(L);84     HeapSort(L);85     printf("堆排序后结果\n");86     print(L);87     return 0;88 }

5.显示结果

6.堆排序的性能

平均时间O(nlogn)  最差情况O(nlogn)

需要O(1)辅助空间

它在小数据量排序性能不好,但是在大数据量排序性能很明显,比快速排序快。

它是不稳定排序