堆排序--数据结构篇

Posted C语言编程学习

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了堆排序--数据结构篇相关的知识,希望对你有一定的参考价值。

堆排序--数据结构篇

堆排序思想


 利用大顶堆(小顶堆)堆顶记录的是最大关键字(最小关键字)这一特性,使得每次从无序中选择最大记录(最小记录)变得简单。

    其基本思想为(大顶堆):

    1)将初始待排序关键字序列(R1,R2....Rn)构建成大顶堆,此堆为初始的无须区;

    2)将堆顶元素R[1]与最后一个元素R[n]交换,此时得到新的无序区(R1,R2,......Rn-1)和新的有序区(Rn),且满足R[1,2...n-1]<=R[n]; 

    3)由于交换后新的堆顶R[1]可能违反堆的性质,因此需要对当前无序区(R1,R2,......Rn-1)调整为新堆,然后再次将R[1]与无序区最后一个元素交换,得到新的无序区(R1,R2....Rn-2)和新的有序区(Rn-1,Rn)。不断重复此过程直到有序区的元素个数为n-1,则整个排序过程完成。

    操作过程如下:

     1)初始化堆:将R[1..n]构造为堆;

     2)将当前无序区的堆顶元素R[1]同该区间的最后一个记录交换,然后将新的无序区调整为新的堆。

    因此对于堆排序,最重要的两个操作就是构造初始堆和调整堆,其实构造初始堆事实上也是调整堆的过程,只不过构造初始堆是对所有的非叶节点都进行调整。


堆排序--数据结构篇

选择排序代码

#include <stdio.h>

#include <stdlib.h>

#define MAX 255

int R[MAX];


void Heapify(int s,int m)

{ /*对R[1..n]进行堆调整,用temp做暂存单元 */

     int j,temp;

     temp=R[s];

     j=2*s;

     while (j<=m)

     {

         if (R[j]>R[j+1]&&j<m) 

            j++;

         if (temp<R[j]) break;

            R[s]=R[j];

         s=j;

         j=j*2;

    }/* end of while */

    R[s]=temp;

} /* end of Heapify */


void BuildHeap(int n)

{ /* 由一个无序的序列建成一个堆 */

   int i;

   for(i=n/2;i>0;i--)

      Heapify(i,n);

}


void Heap_Sort(int n)

{ /* 对R[1..n]进行堆排序,不妨用R[0]做暂存单元 */

    int i;

    BuildHeap(n); /* 将R[1-n]建成初始堆 */

    for(i=n;i>1;i--)

    { /* 对当前无序区R[1..i]进行堆排序,共做n-1趟。 */

        R[0]=R[1]; R[1]=R[i];R[i]=R[0]; /* 将堆顶和堆中最后一个记录交换 */

        Heapify(1,i-1); /* 将R[1..i-1]重新调整为堆,仅有R[1]可能违反堆性质 */

    } /* end of for */

} /* end of Heap_Sort */


int main()

{

    int i,n;

    puts("Please input total element number of the sequence:");

    scanf("%d",&n);

    if(n<=0||n>MAX)

    {

        printf("n must more than 0 and less than %d.\n",MAX);

        exit(0);

    }

    puts("Please input the elements one by one:");

    for(i=1;i<=n;i++)

        scanf("%d",&R[i]);

    puts("The sequence you input is:");

    for(i=1;i<=n;i++)

        printf("%4d",R[i]);

    Heap_Sort(n);

    puts("\nThe sequence after Big heap_sort is:");

    for(i=1;i<=n;i++)

        printf("%4d",R[i]);

    puts("\n Press any key to quit...");

    return 0;

}

堆排序--数据结构篇
堆排序--数据结构篇

你说你喜欢雨,但是你在下雨的时候打伞

你说你喜欢太阳,但你在阳光明媚的时候躲在阴凉的地方

你说你喜欢风,但是在刮风的时候你却关上了窗户

这就是为什么我会害怕你说你也喜欢广告

因为你连“Java编程精简实例”都没有关注

关注

C语言编程学习

长按二维码,关注我



以上是关于堆排序--数据结构篇的主要内容,如果未能解决你的问题,请参考以下文章

学会堆排序只需要几分钟

挖掘算法中的数据结构:堆排序之 二叉堆(Heapify原地堆排序优化)

算法与数据结构堆排序是什么鬼?

数据结构与算法:树 堆排序

挖掘算法中的数据结构:排序算法总结 和 索引堆及优化(堆结构)

数据结构与算法:树 堆排序