通过数组实现遇到Downheap Algorithm问题

时间:2014-11-03 04:29:00

标签: c arrays algorithm sorting

我目前正在尝试使用Down-heap算法对我的键数组进行排序。但是,当我显示新排序的数组时,会出现新数字,但顺序似乎不正确。我不知道我的算法是否有问题,或者我没有使用适当的条件来进行这种排序算法。

我的工作是对20个键的数组进行排序。

守则:

/* Downheap sorting algorithm */
for(i=0; i<20; i++)
{
    j = i + 1;

    /* If parent is less than both children */
    if(key[j] < key[2*j] && key[j] < key[(2*j)+1])
    {
        /* Check which child is smallest */
        if(key[2*j] < key[(2*j)+1])
        {
            /* Parent is assigned smallest node */
            swap(&key[j],&key[2*j]);
        }
        else{swap(&key[j],&key[(2*j)+1]);}
    }

    /* If parent is less than left child */
    else if(key[j] < key[2*j])
    {
        swap(&key[j],&key[2*j]);
    }

    /* If parent is less than right child */
    else if(key[j] < key[(2*j)+1])
    {
        swap(&key[j],&key[(2*j)+1]);
    }
}

交换功能:

void swap(int *parent, int *child)
{
    int temp;
    temp = *child;
    *child = *parent;
    *parent = temp; 
}

排序前的键数组:

54,90,137,260,185,65,208,139,114,176,186,77,137,139,178,57,203,110,80,127

排序后的键数组:

54,137,185,260,114,77,208,178,110,176,186,65,137,139,139,64,203,90,84,127
64以前不存在。 57在哪里? 80已经消失了,84来自哪里?

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:0)

通过“DownHeap”我认为你的意思是Min-Heap

Algo for min heap:

public void insert(Comparable x) { if(size == heap.length - 1) doubleSize();

//Insert a new item to the end of the array
int pos = ++size;

//Percolate up
for(; pos > 1 && x.compareTo(heap[pos/2]) < 0; pos = pos/2 )
    heap[pos] = heap[pos/2];

heap[pos] = x;

}“

检查此链接了解min heap min heap

答案 1 :(得分:0)

如果你有一个包含20个数字的数组,它们通常是键[0] .. key [19],并且在堆中你需要考虑堆元素的一个或多个子元素不具有的可能性存在是因为它们的数组位置不在数组的边缘。随着堆数0..19,那么元素i的子元素将是2i + 1和2i + 2,所以0有子元素1和2,1有子元素3和4 ... 8有子元素17和18,但是9只有一个孩子在19岁,10岁没有孩子。

您是否期望Downheap能够完成排序的所有工作?通常,如http://en.wikipedia.org/wiki/Heapsort所述,Downheap是Heapsort的一部分,但不是全部。