堆排序(小根堆)

原创 2017年02月20日 19:56:31
 void push(int x) {
    h[++lenn]=x;
    int index=len;
    while(index>1 && h[index]<h[index/2]){
        swap(h[index],h[index/2]);
        index=index/2;
    }
 }//在数组后面加多一个元素,进行调整时只需要往上调整,跟父节点比较就好(不用从最后一个有节点的节点开始遍历,进行向下调整)
void down_adjust(int n){
	int num=n,k=n*2;//k为左儿子
	int tmp=h[n];
	while(k <= len){
		if(k < len && h[k] > h[k+1]){
			k++;
		}//如果右儿子存在,而且值比左儿子小,那么k++,待会父节点跟右儿子比较
		if(h[k] >= tmp){
			break;
		}
		else{
			h[num]=h[k];
			num=k;
			k=k*2;
		}
	}
	h[num]=tmp;
	}
}//向下调整
 void pop(int n) {
 	if(len >= 1){
    swap(h[1],h[len]);
    len--;
	down_ adjust(n);
}//删除某个位置的结点,这时候只需要跟最后一个数交换,然后再向下调整就好
void create(int len) {
    for(int i=len/2; i >= 1; i--){
        int num=i,k=i*2;
        int tmp=h[i];
        while(k <= len){
        if(k < len && h[k] > h[k+1]){
            k++;
        }
        if(h[k] >= tmp){
            break;
        }
        else{
            h[num]=h[k];
            num=k;
            k=k*2;
        }
    }
    h[num]=tmp;

 }//对于一个完全无序的数组进行调整,使得我们能进行堆排序,就是从最后一个有节点的节点往前遍历所有节点,然后依次对所有节点向下调整
上面那个数组的下标是从1开始



版权声明:本文为博主原创文章,未经博主允许不得转载。

堆排序—大根堆,小根堆

1.小根堆 若根节点存在左子女则根节点的值小于左子女的值;若根节点存在右子女则根节点的值小于右子女的值。 2.大根堆 若根节点存在左子女则根节点的值大于左子女的值;若根节点存在右子女则根节点的值...
  • abcd1f2
  • abcd1f2
  • 2017年02月04日 15:27
  • 1082

堆排序小根堆 大根堆 迭代 递归 总结 完整代码

http://blog.csdn.net/morewindows/article/details/6709644/
  • WangDong_CNDS
  • WangDong_CNDS
  • 2016年10月05日 15:30
  • 1418

排序——堆排序-大根堆(大顶堆)

1.小根堆 若根节点存在左子女则根节点的值小于左子女的值;若根节点存在右子女则根节点的值小于右子女的值。 2.大根堆 若根节点存在左子女则根节点的值大于左子女的值;若根节点存在右子女则根节点的值大于右...
  • laoniu_c
  • laoniu_c
  • 2014年08月12日 12:46
  • 3723

堆排序(小根堆)

小根堆排序。
  • u012566693
  • u012566693
  • 2014年12月22日 16:27
  • 826

[大、小根堆应用总结一]堆排序的应用场景

前言 在整理算法题的时候发现,大根堆(小根堆)这种数据结构在各类算法中应用比较广泛,典型的堆排序,以及利用大小根堆这种数据结构来找出一个解决问题的算法最优解。因此,我打算单独将关于堆的应用独立总结...
  • shakespeare001
  • shakespeare001
  • 2016年05月10日 09:53
  • 5064

堆排序(大根堆)

堆排序是利用堆的性质进行的一种选择排序。下面先讨论一下堆。 1.堆   堆实际上是一棵完全二叉树,其任何一非叶节点满足性质:   Key[i]=Key[2i+1]&&key>=key[2i+2]...
  • chenhuajie123
  • chenhuajie123
  • 2013年09月22日 15:47
  • 17323

重学数据结构系列之——堆及堆排序

1.定义 满足一下两个条件 1.首先它是一颗完全二叉树(就是除了最后一层,每个结点都有两个孩子,最后一层只缺少右边的若干结点。)看看这个就明白:http://baike.baidu.com/pic...
  • u012763794
  • u012763794
  • 2016年03月29日 21:33
  • 593

链式结构实现堆排序

在很多数据结构和算法的书上,“堆排序”的实现都是建立在数组上,数组能够通过下标访问其元素,其这一特性在堆排序的实现上,使得其编码实现比链式结构简单,下面我利用链表实现堆排序。 在“堆”这种数据结构中...
  • u013314067
  • u013314067
  • 2015年03月10日 20:07
  • 553

堆排序的链式实现

GCC编译通过:#include #include #define N 10 #define MAX 100 typedef struct node{ int data; stru...
  • BTnode
  • BTnode
  • 2015年03月08日 23:15
  • 357

利用Python实现堆排序

在这里要事先说明一下我也是新手,很多东西我了解不是很深入,写算法完全是锻炼自己逻辑能力同时顺带帮助读研的朋友么解决一些实际问题。所以很多时候考虑的东西不是很全面能请各位看到博文的大牛们指正。对于排序算...
  • minxihou
  • minxihou
  • 2016年07月07日 11:41
  • 4373
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:堆排序(小根堆)
举报原因:
原因补充:

(最多只允许输入30个字)