您的位置:首页 > 其它

排序(三)之堆排序

2017-12-29 00:38 134 查看
由堆的性质可知,由于每个 DeleteMin 花费的时间为 O(logN),因此总的运行时间是 O(NlogN)。但该算法的主要问题在于它使用了一个附加数组。

避免使用第二个数组的方法:

在每次 DeleteMin 之后,堆缩小了 1 。因此,位于堆中最后的单元可以用来存放刚刚删去的元素。例如:设我们有一个堆,它包含六个元素。第一次 DeleteMin 产生一个 A1。现在只有五个元素,因此我们可以把 A1 放在位置6上。下一次 DeleteMin 产生一个 A2,由于该堆现在只有四个元素,因此我们把 A2 放到位置 5 上。

#define LeftChild(i) 2 * i + 1

void percDown(ElementType arr[], int i, int n)
{
int child;
ElementType tmp;
for(tmp = arr[i]; LeftChild(i) < n; i = Child)
{
child = LeftChild(i);
if(child != n - 1 && arr[child + 1] > arr[child])
{
child++;
}
if(tmp < arr[child])
{
arr[i] = arr[child];
}
else
{
break;
}
}
arr[i] = tmp;
}

void heapSort(ElementType arr[], int n)
{
int i;
for(i = n / 2; i >= 0; i--) //BulidHeap
{
percDown(arr, i, n);
}
for(i = n - 1; i > 0; i--)
{
//DeleteMax
//same: swap the min element and the max element
swap(arr[0], arr[i]);
percDown(arr, 0, i);
}
}


参考:

堆排序原理及算法实现(最大堆)

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

白话经典算法系列之七 堆与堆排序
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  堆排序