迭代时排序的最佳算法是什么?

时间:2015-10-19 21:49:38

标签: algorithm sorting

让我们说,我有一个数组,我想在迭代数组时对Array的索引进行排序。数组不会被修改,但索引将根据Array元素的值按排序顺序排列。我举个例子。

数组= [1,7,5,4,3,8]

排序后的索引是

SortedIndexes = [0,4,3,2,1,5]

我想要这样,在迭代整个数组后,我已经有了那些排序的索引。现在,这是最好的方法。

2 个答案:

答案 0 :(得分:3)

首先,按顺序创建一个包含主数组索引的辅助数组。辅助数组就是您实际要排序的内容。

然后,您可以将主阵列上的迭代与辅助阵列的插入排序组合在一起。对于主迭代中的每个索引,首先执行主操作所需的任何处理,然后在辅助数组中执行插入排序的插入步骤。完成后,辅助数组包含已排序的索引。

插入排序是一种比较排序,因此其平均和最差情况成本与N 2 成比例,但它是该类中最好的。它的主要优点是它的工作方式可以与主迭代完全集成。如果数据不会很大,那么缩放可能不是问题。对于较小的数据,插入排序实际上可能胜过一些可以更好地扩展的替代方案。

答案 1 :(得分:1)

合并排序可以做更多动作,但比快速排序更少。在这种情况下,正在移动索引,并且正在比较对象。事物的比较开销涉及一个间接级别(通过索引访问),并且对象比较通常是随机分布的而不是缓存友好意味着比较开销大于索引移动开销,在这种情况下合并排序应该比快速排序更快。

一旦有了一个排序索引数组,就可以使用循环排序的变体在O(n)时间内对原始数组进行重新排序。这具有将索引数组恢复为0到n-1的副作用。

void reorder_according_to(int array[], size_t indices[], size_t len)  
{
size_t i, j, k;
int t;
    for(i = 0; i < len; i++){
        if(i != indices[i]){
            t = array[i];
            k = i;
            while(i != (j = indices[k])){
                array[k] = array[j];
                indices[k] = k;
                k = j;
            }
            array[k] = t;
            indices[k] = k;
        }
    }
}