首页 > 代码库 > 堆排序
堆排序
堆排序是对简单选择排序算法的一种改进,在每次选择最小记录的同时,根据比较结果对其他记录做出相应的调整。
堆是具有下列性质的完全二叉树:每个节点的值都大于(小于)或者等于其左右孩子节点的值,为大顶堆(小于)。
堆排序的基本思想是:从最后一个含有叶子节点的节点开始将待排序列构造成一个堆,然后将堆顶元素与末尾元素交换,然后不管末尾元素,将剩余的元素重新形成一个堆,如此反复,直到有序。
注意:由于堆是一种树形结构,所以被排序的序列要从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
堆排序
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。