zoukankan      html  css  js  c++  java
  • 堆排序

    堆排序是对简单选择排序算法的一种改进,在每次选择最小记录的同时,根据比较结果对其他记录做出相应的调整。

    堆是具有下列性质的完全二叉树:每个节点的值都大于(小于)或者等于其左右孩子节点的值,为大顶堆(小于)。

    堆排序的基本思想是:从最后一个含有叶子节点的节点开始将待排序列构造成一个堆,然后将堆顶元素与末尾元素交换,然后不管末尾元素,将剩余的元素重新形成一个堆,如此反复,直到有序。

    注意:由于堆是一种树形结构,所以被排序的序列要从1开始编号。

    // 堆排序.cpp : 定义控制台应用程序的入口点。
    //
    
    #include "stdafx.h"
    #include<iostream>
    using namespace std;
    //将L数组中s到len的数据建立成为大顶堆
    void HeapAdjust(int *L,int s,int len)
    {
        int  temp;
        temp=L[s];
        for(int j=2*s;j<=len;j=j*2)
        {
            if(j<len&&L[j]<=L[j+1])//找到孩子节点中较大的那个
            {
                j++;
            }
            if(temp<L[j])//如果节点比孩子节点中较大的那个小,将此节点替换为较大的孩子节点
            {
                L[s]=L[j];
                s=j;
            }
        }
        L[s]=temp;
    }
    void swap(int *L,int i,int j)
    {
        int temp=L[i];
        L[i]=L[j];
        L[j]=temp;
    }
    //输入数组名和数组长度,进行堆排序
    void heapsort(int *L,int len)
    {
        //从最后一个含有叶子节点的节点开始构造堆(参见二叉树性质5)
        for(int i=len/2;i>0;i--)
        {
            HeapAdjust(L,i,len);
        }
        //每一次交换堆顶和堆尾元素,然后重新构造堆
        for(int i=len;i>1;i--)
        {
            swap(L,1,i);
            HeapAdjust(L,1,i-1);
        }
    }
    int _tmain(int argc, _TCHAR* argv[])
    {
        int num[10]={0,2,5,4,7,5,4,8,41,86};
        //注意这里由于堆排序利用的是二叉树的第五条性质,所以数组下标要从1开始,num中0不在排序的序列之中
        heapsort(num,9);
        for(int i=1;i<10;i++)
        {
            cout<<num[i]<<' ';
        }
        return 0;
    }

    更加图文并茂的推荐一篇别人的博文:http://www.cnblogs.com/dolphin0520/archive/2011/10/06/2199741.html

  • 相关阅读:
    eclipse改变默认的编码格式(UTF-8)
    Guava学习:Joiner和Splitter工具(二)
    Guava中的Joiner和Splitter工具演示
    GitHub查找开源项目技巧分享
    java1.8特性之多重排序简单示例
    jedis工具类:java操作redis数据库
    SQL优化建议(mysql)
    Moodle插件之Filters(过滤器)
    Moodle插件开发系列——XMLDB编辑器
    Moodle插件开发——Blocks(版块)
  • 原文地址:https://www.cnblogs.com/bewolf/p/4175066.html
Copyright © 2011-2022 走看看