zoukankan      html  css  js  c++  java
  • 堆排序(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;
    }
    

    实验结果:

  • 相关阅读:
    Running ASP.NET Applications in Debian and Ubuntu using XSP and Mono
    .net extjs 封装
    ext direct spring
    install ubuntu tweak on ubuntu lts 10.04,this software is created by zhouding
    redis cookbook
    aptana eclipse plugin install on sts
    ubuntu open folderpath on terminal
    ubuntu install pae for the 32bit system 4g limited issue
    EXT Designer 正式版延长使用脚本
    用 Vagrant 快速建立開發環境
  • 原文地址:https://www.cnblogs.com/claireyuancy/p/7157234.html
Copyright © 2011-2022 走看看