zoukankan      html  css  js  c++  java
  • 堆排序(heapsort)

    #include<iostream>
    #include<stdio.h> 
    using namespace std;
    /**
    创建一个堆:大的数是根 
    */ 
    void swap(int arr[],int i,int j)
    {
    	int temp= arr[i];
    	arr[i]=arr[j];
    	arr[j]=temp;
    }
    void heapify(int tree[],int n,int i)
    {
    	//检查输入的这个节点的位置对不对
    	//如果大的数在底层就让它上去 
    	if(i>=n)
    	{
    		return;
    	}
    	int c1 = 2*i+1;
    	int c2 = 2*i+2;
    	//计算两个儿子的编号 
    	int max = i;
    	if(c1<n && tree[c1]>tree[max])
    	{
    		max=c1;
    	}
    	if(c2<n && tree[c2]>tree[max])
    	{
    		max=c2;
    	}
    	//查找儿子们和父亲中那个大 
    	if(max!=i)
    	{
    		swap(tree,max,i);
    		heapify(tree,n,max);
    	}
    	//如果儿子大于父亲就交换
    	//然后继续往下一层判断 
    }
    void build_heap(int tree[],int n) 
    {
    	//对每一节点都检查一遍就成功建立成了一个堆 
    	int last_node = n-1;
    	int parent=(last_node-1)/2;
    	for(int i=parent;i>=0;--i)
    	{
    		heapify(tree,n,i);
    	}
    }
    /*
    堆排序:从大到小 
    */
    void heap_sort(int tree[],int n)
    {
    	build_heap(tree,n);
    	for(int i=n-1;i>=0;--i)
    	{
    		swap(tree,i,0);//交换根节点和最后一个叶子 
    		heapify(tree,i,0);//砍断那个最后的叶子 
    	}
    }
    int main()
    {
    	int tree[]={4,10,2,5,1,3};
    	int n=6;
    	//堆排序 
    	heap_sort(tree,n);
    	
    	for(int i=0;i<n;++i)
    	{
    		cout<<tree[i]<<" "<<endl;
    	 } 
    	return 0;
    } 

    来自灯神的讲解,这里我加了一点自己的注释:https://www.bilibili.com/video/av47196993

  • 相关阅读:
    Python有返回值的函数_布尔函数
    struts通配符*的使用
    实现action的三种方法
    filter
    struts常量<constant>说明
    dtd文件本地配置
    namespace
    Spring的第一个例子
    SSH新学,关于面向对象的看法
    @OneToMany---ManyToOne
  • 原文地址:https://www.cnblogs.com/chrysanthemum/p/11770649.html
Copyright © 2011-2022 走看看