這不是一種真正的排序。它實際上主要是一個map或一個轉換。這是他們擁有的數據結構的一個例子:
my $hash = {
foo => { order => 3 },
bar => { order => 20 },
baz => { order => 66 },
};
它只是'order'到數組元素的轉換。例如,如果你將這個$ hash傳遞給perfect_insert_sort,它將返回一個67元素的數組,其中有三個項目(一個在索引3,一個在20,一個在66),其餘的都是undef,並且完全是未分類的訂購。
沒有關於該功能的任何類型的任何排序。如果有是在其他答案中進行的任何排序,則在之前發生該函數被調用。
@downvoter:
而且看對方的回答中,排序發生在插入時間。這個組件可能被認爲是一種排序。然而,這個子程序不會創建這個順序 - 它只是重新構建它。
看一看的classical definition爲一種:
- 輸出是在非遞減順序(每個元素是根據期望的總時間比該前一元素不小於)
- 的輸出是一個輸入的排列或重新排序。
第2部分肯定會得到滿足:哈希結構轉換爲正在進行的列表。但是,第1部分並不滿意。沒有確定訂單的情況。訂單在插入期間已經預先確定。如果這是一個「排序」,那麼下面也將是一個排序:
my @data = ... ;
my $index = -1;
my %stored = map { ++$index; $_ => { order => $index } } @data;
my @remade_data;
@remade_data[(map { $stored{$_}{order} } keys %stored)] = keys %stored;
正如你所看到的,沒有排序的代碼該塊,僅僅改造正在進行。
這是怎麼回事?這只是一個「重新排序」。真正的排序發生在「訂單」字段被填充時。 – Arkadiy 2010-09-07 12:50:35
@Arkadiy它是一種排序,因爲順序是單調函數的結果。你可能會說你不能對一組正整數(它正在做什麼)進行排序。它只是一個特殊情況下的桶排序(由於數據是如何創建的,我們知道它是連續的,從0開始,沒有重複或跳過,因此是完美的前綴)。 – 2010-09-07 13:00:05
請通過顯示'$ h'的內容來澄清您的答案。否則,這是將某個置換應用於數組的更一般情況。 – MAK 2010-09-08 19:48:09