码迷,mamicode.com
首页 > 编程语言 > 详细

堆排序

时间:2015-09-16 14:24:17      阅读:168      评论:0      收藏:0      [点我收藏+]

标签:

堆排序,这个上座率也比较高。
一般出现的问题是这样的,在 N 个数中找到前 K 个最大(小)的。
这种问题就是比较典型的大(小)顶堆,即堆顶的数值大于堆的孩子。
堆排序主要有建堆,或者叫做调整堆,及取堆顶。
一般在实现时采用树来实现,比如二叉树。
二叉树和数组有天然的映射关系,即数组中下标为 i 的左右子树分别为 2*i 及 2*i + 1。
不多说了,看代码,C# 实现的。

static void HeapAdjust(List<int> list, int parent, int length)
{
    int temp = list[parent];
    int child = 2 * parent + 1;
    while (child < length)
    {
        if (child + 1 < length && list[child] < list[child + 1]) child++;
        if (temp >= list[child])
            break;
        list[parent] = list[child];
        parent = child;
        child = 2 * parent + 1;
    }
    list[parent] = temp;
}
static List<int> HeapSort(List<int> list)
{
    List<int> topNode = new List<int>();
    for (int i = list.Count / 2 - 1; i >= 0; i--)
    {
        HeapAdjust(list, i, list.Count);
    }
    for (int i = list.Count - 1; i >= 0; i--)
    {
        int temp = list[0];
        list[0] = list[i];
        list[i] = temp;
        topNode.Add(temp);
        HeapAdjust(list, 0, i);
    }
    return topNode;
}
static void HeapSortTest()
{
    List<int> lst = new List<int>() { 8, 4, 2, 5, 3, 0, 9, 1, 7, 6 };
    var retlst = HeapSort(lst);
    foreach (var item in lst)
    {
        Console.Write(item + ", ");
    }
    Console.Write("\n");
    foreach (var item in retlst)
    {
        Console.Write(item + ", ");
    }
    Console.ReadKey();
}

这个排序返回的列表是逆序的。
传入的列表本身排序后是顺序的。

堆排序

标签:

原文地址:http://my.oschina.net/xhan/blog/506773

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!