• 堆排序(C语言实现)


                之前的博客介绍介绍了数组的两种排序算法:插入排序和归并排序(採用递归),见链接http://blog.csdn.net/u013165521/article/details/46845033

            本篇博客,介绍还有一种排序算法:堆排序。

    (内容參照算法导论)

    一、堆的概念

             所谓堆,它是一个数组,也能够被看成一个近似的全然二叉树。树上每一个结点相应数组的一个元素。二叉堆分为二种:最大堆和最小堆。本文主要介绍最大堆,最小堆类似。最大堆的特点:对于随意某个结点,该结点的值大于左孩子、右孩子的值,可是左右孩子的值没有要求。

    二、堆排序算法

             堆排序算法调用函数Build_max_heap将输入数组array[1..n]建立成堆。当中n表示数组长度。由于建立堆后,数组的最大元素被存放在根节点A[1],通过将A[1]与数组最后一个元素进行交换。将最大元素后移,实现排序。

    可是,交换后新的根节点可能不满足堆的特点,所以须要调用子函数Max_heapify对剩余的数组元素进行最大堆性质的维护。堆排序算法。通过不断反复这个过程(n-1)次,实现数组的从小到大排序(由于採用最大堆)。

             对于上面提及的两个子函数进行简要介绍。

             函数Build_max_heap的作用:建堆

    由于子数组A(n/2+1..n)是树的叶子节点,不须要进行堆的维护。

    所以。仅仅须要对A[1..n/2]数组元素进行维护。就可构建堆。

             函数Max_heapify的作用:维护堆。过程:如果A[i]表示树的某个结点,则A[2*i]是其左孩子,A[2*i+1]是其右孩子。接下来,比較三者大小挑选出最大元素的下标,存放于largest。然后。推断(largest==i)吗。若不满足则进行元素交换。将大的元素上移。

    此时,以A[largest]为根节点的子树可能不满足堆的性质,所以须要递归调用自身。


    三、算法实现

             上面介绍堆实现数组排序的原理,以下直接给出源代码。
    #include <stdlib.h>
    #include <stdio.h>
    #include <iostream>
    
    using namespace std;
    
    void Swap(int *x, int *y);
    
    void Max_heapify(int array[], int i, int heap_size);
    void Build_max_heap(int array[],int len);
    void Heapsort(int array[],int len);
    
    void Swap(int *x, int *y)
    {
    
    	int temp;
    	temp=*x;
    	*x=*y;
    	*y=temp;
    }
    
    void Max_heapify(int array[], int i, int heap_size)
    {
    	int largest;
    	int _left=2*i;
    	int _right=2*i+1;
    
    	if (_left<=heap_size && array[_left]>array[i])
    	{
    		largest=_left;
    	}
    	else
    		largest=i;
    
    	if (_right<=heap_size && array[_right]>array[largest])
    	{
    		largest=_right;
    	}
    
    	if (largest!=i)
    	{
    		Swap(&array[largest],&array[i]);
    		Max_heapify(array,largest,heap_size);
    	}
    }
    
    void Build_max_heap(int array[],int len)
    {
    
    	int heap_size=len;
    	for (int i=len/2; i>=1; i--)
    	{
    		Max_heapify(array,i,heap_size);
    	}
    }
    
    void Heapsort(int array[],int len)
    {
    	int heap_size=len;
    	Build_max_heap(array,len);
    	for (int i=len; i>=2; i--)
    	{
    		Swap(&array[1],&array[i]);
    		heap_size--;
    		Max_heapify(array,1,heap_size);
    	}
    }
    
    void main()
    {
    
    	int array[]={0,14,10,8,7,9,3,2,4,1};
    	int len=9;
    	Heapsort(array,len);
    
    	cout<<"heap sort result:
    ";
    	for (int i=1; i<=len; i++)
    	{
    		cout<<array[i]<<" ";
    	}
    	cout<<endl;
    }
    

    实验结果:

  • 相关阅读:
    最舒适的路线(并查集)
    POJ 2411 状态压缩DP
    NYOJ 708 ones
    HUD 1024 Max Sum Plus Plus
    最长上升子序列
    HDU 4717 The Moving Points
    重新开始写随笔
    读书的意义
    读《如何阅读一本书》笔记
    读《GRAY HAT PYTHON》笔记
  • 原文地址:https://www.cnblogs.com/claireyuancy/p/7157234.html
Copyright © 2020-2023  润新知