堆排序

原创 2016年05月30日 11:23:10
  • 堆数据结构是一个完全二叉树,父结点值都大于子结点值(都小于子结点值)。
  • 用数组表示堆(0,...,size-1),根节点的下标为0,对于任意一个结点i,其左子结点为2*i+1, 右子结点为2*i+2。
  • 堆中最后一个非叶子结点的下标为size/2-1。

//例程中是建一个大头堆
template<typename T>
void adjustHeap(T data[], int start, int end)
{
	//沿着子结点下顺
	//start的左子结点为2*start+1,右子结点为2*start+2.
	for (int i = 2 * start + 1; i < end; ++i)
	{
		if (i < end - 1 && data[i] < data[i + 1])//这里需要注意一下i+1会不会越界
		{
			++i;//让i指向子结点中的较大者
		}
		if (data[i] < data[start]) //满足堆性质,不用调整
		{
			break;
		}

		//最大子结点与父结点交换
		T temp = data[start];
		data[start] = data[i];
		data[i] = temp;
		
		start = i;//start下顺,接着调整
	}
}


//将一个数组初始化为堆,从最后一个非叶子开始从下往上进行adjustHeap
template<typename T>
void buildHeap(T data[], int size)
{
	for (int start = size / 2 - 1; start >= 0; --start)
	{
		adjustHeap(data, start, size);
	}
}

template<typename T>
void heapSort(T data[], int size)
{
	//对数组建堆
	buildHeap(data, size);

	//将堆的第一个元素与最后一个元素交换,然后adjustHeap
	for (int i = size - 1; i > 0; --i)
	{
		T temp = data[0];
		data[0] = data[i];
		data[i] = temp;

		adjustHeap(data, 0, i);
	}

}

下面补充一个递归版的adjust_heap:

template<class T>
void adjust_heap(T heap[], int start, int end) //[start, end)
{
    int left = 2 * start + 1, right = 2 * start + 2;
    if (left < end)
    {
        int max_idx = left;
        if (right < end)
        {
            if (heap[left] < heap[right])
            {
                max_idx = right;
            }
        }
        if (heap[max_idx] <= heap[start])
        {
            return; //不用调整了,父节点最大
        }
        std::swap(heap[start], heap[max_idx]);
        adjust_heap(heap, max_idx, end);
    }
}


排序算法(七)——堆排序

基本思想 堆排序是一种树形选择排序,是对直接选择排序的改进。   首先,我们来看看什么是堆(heap): (1)堆中某个节点的值总是不大于或不小于其父节点的值; (2)堆总是一棵完全二叉树(Compl...
  • u012152619
  • u012152619
  • 2015年08月13日 08:39
  • 13668

【Python排序搜索基本算法】之堆排序

堆是一种完全二叉树,堆排序是一种树形选择排序,利用了大顶堆堆顶元素最大的特点,不断取出最大元素,并调整使剩下的元素还是大顶堆,依次取出最大元素就是排好序的列表。举例如下,把序列[26,5,77,1,6...
  • littlethunder
  • littlethunder
  • 2014年04月16日 21:47
  • 8757

堆排序(Heapsort)之Java实现

堆排序算法介绍 堆是一种重要的数据结构,为一棵完全二叉树, 底层如果用数组存储数据的话,假设某个元素为序号为i(Java数组从0开始,i为0到n-1), 如果它有左子树,那么左子树的位置是2i+1,如...
  • kimylrong
  • kimylrong
  • 2013年12月05日 22:25
  • 52815

堆排序

  • 2014年12月25日 21:57
  • 205KB
  • 下载

数据结构堆排序

  • 2017年12月24日 10:27
  • 1KB
  • 下载

堆排序之Java实现

  • 2017年07月27日 17:03
  • 4KB
  • 下载

堆排序法.cpp

  • 2015年07月26日 12:45
  • 2KB
  • 下载

堆排序及其用途

  • 2016年03月25日 13:46
  • 214KB
  • 下载

堆排序算法c语言实现

  • 2015年10月25日 14:24
  • 2KB
  • 下载

堆排序算法导论

  • 2013年11月11日 23:54
  • 152KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:堆排序
举报原因:
原因补充:

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