• 排序算法之堆排序


    堆排序(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);
    	}
    }


  • 相关阅读:
    UVa 1451 Average (斜率优化)
    POJ 1160 Post Office (四边形不等式优化DP)
    HDU 3507 Print Article (斜率DP)
    LightOJ 1427 Substring Frequency (II) (AC自动机)
    UVa 10245 The Closest Pair Problem (分治)
    POJ 1741 Tree (树分治)
    HDU 3487 Play with Chain (Splay)
    POJ 2828 Buy Tickets (线段树)
    HDU 3723 Delta Wave (高精度+calelan数)
    UVa 1625 Color Length (DP)
  • 原文地址:https://www.cnblogs.com/zkkkkkky/p/4422996.html
Copyright © 2020-2023  润新知