zoukankan      html  css  js  c++  java
  • 排序算法之堆排序

    堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。可以利用数组的特点快速定位指定索引的元素。堆分为大根堆和小根堆,是完全二叉树。大根堆的要求是每个节点的值都不大于其父节点的值,即A[PARENT[i]] >= A[i]。在数组的非降序排序中,需要使用的就是大根堆,因为根据大根堆的要求可知,最大的值一定在堆顶。

    简单来说,就是利用二叉树,

    1.建最大保持待排序区的最大数据永远是根节点,

    2.将根节点与最后一个叶子节点互换位置.二叉树节点数减一.

    3.因为新换上来的根节点不一定满足"最大"这个条件.所以要重新建堆.

    4.重复步骤1-4.一直到二叉树大小为0.

    struct Date
    {
    	int date[100];
    	int size;
    };
    
    //建最大根堆
    void max_heapify(Date *pDate,int a){
    	
    	int largest;
    	int left = a*2;
    	int right =left+1;
    	if(left>pDate->size && right>pDate->size) return;
    	if (left <= pDate->size) largest = pDate->date[a]>pDate->date[a*2]?a:left;
    	if (right <= pDate->size) largest = pDate->date[largest]>pDate->date[a*2+1]?largest:right;
    	if (largest != a){
    		int temp;
    		temp = pDate->date[a];
    		pDate->date[a] = pDate->date[largest];
    		pDate->date[largest] = temp;
    		max_heapify(pDate,largest);
    	}
    	else 		return;
    }
    
    //建堆
    void build_max_heap(Date *pDate)
    {
    	int size = pDate->size;
    	int i = size/2;
    	while (i)
    	{
    		max_heapify(pDate,i);
    		size -= 2;
    		i =size/2;
    	}
    }
    
    //排序
    void heapsort(Date *pDate)
    {
    	int temp;
    	build_max_heap(pDate);
    	for (int i = pDate->size; i > 0; i--)
    	{
    		temp = pDate->date[i];
    		pDate->date[i] = pDate->date[1];
    		pDate->date[1] = temp;
    		pDate->size--;
    		max_heapify(pDate,1);
    	}
    }


  • 相关阅读:
    002.NFS相关配置项
    001.NFS简介
    002.DNS-BIND简介
    001.DNS原理及配置格式
    002.DHCP配置
    001.DHCP简介
    001.Chrony时间服务器
    博客开篇记载!
    【python-opencv】图像梯度
    【python-opencv】形态转换
  • 原文地址:https://www.cnblogs.com/zkkkkkky/p/4422996.html
Copyright © 2011-2022 走看看