为什么堆排序不被视为稳定的排序算法

时间:2015-08-04 09:14:11

标签: java arrays algorithm sorting data-structures

在Java中,Heap排序似乎是最好的排序算法,同时根据http://www.sorting-algorithms.com/对随机数组进行排序 但我仍然读到Heap排序不稳定,为什么呢?在对数组或随机数进行排序时,哪种排序算法应被视为最佳算法?

3 个答案:

答案 0 :(得分:2)

因为它不能保证当它在正在排序的集合中遇到2个相等的元素时,它们的位置将被保留。 让我们说这个集合:3 2 2 1。当此算法遇到2并将其与2进行比较时,它可能会反转它们。 Sorting algorithms stability。 顺便说一下,如果您不关心收藏品中相同商品的顺序,那么您可以选择最快的商品。

答案 1 :(得分:1)

您应该阅读this

堆排序使用二进制堆,使用的数据结构和算法使得heapsort不稳定。

答案 2 :(得分:1)

  

稳定排序:一种不会改变相同/相等元素相对位置的排序。

     

例如,
  I / P:2,4,3(a),5,1,3(b)
  O / P:1,2,3(a),3(b),4,5

     

在I / P 3(b)中,在3(a)之后,同样在O / P中保持不变。

可以很容易地解释。我们来看下面的例子:

3(a),3(b),2,1

将前3个视为3(a),将第3个视为3(b)。

3(b),2,1,3(a)

Heapsort首先从max-heap中提取最大数字,这是第一个元素,然后将它放在最后一个位置。

2,1,3(b),3(a)

然后将size减少1并应用heapify操作。因此,新大小为3,前三个元素已经满足堆属性。

现在出现了显示heapsort不稳定的步骤

我们将再次从作为第一个元素的堆中提取最大值并将其放在最后位置。

但是因为大小现在是3,所以最后一个位置留在3(a),因此我们得到:

1,2,3(b),3(a)

我们可以看到元素3(a)和3(b)的顺序与原始顺序相反,而heapsort的剩余部分只会对前两个元素进行排序,因此,元素3(a)和3(b)将在其位置保持完整。这就是heapsort不稳定的原因。

最终结果是

@implementation ArrayDataSource

- (id)itemAtIndexPath:(NSIndexPath*)indexPath {
    return items[(NSUInteger)indexPath.row];
}

- (NSInteger)tableView:(UITableView*)tableView 
 numberOfRowsInSection:(NSInteger)section {
    return items.count;
}

- (UITableViewCell*)tableView:(UITableView*)tableView 
        cellForRowAtIndexPath:(NSIndexPath*)indexPath {
    id cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier
                                              forIndexPath:indexPath];
    id item = [self itemAtIndexPath:indexPath];
    configureCellBlock(cell,item);
    return cell;
}

@end