2017-06-24 49 views
-2

我想了解更好的排序算法顯示在下面,我沒有成功,因爲我不是從計算機領域,我不知道這個算法在一些已知的一個。瞭解更好的排序算法 - 尋找一個關於它的參考

#include <iostream> 
#include <cstdlib> 
#include <ctime> 

int main() { 
    int unsorted[100] = {}; 
    srand (time(NULL)); 
    for (int i = 0; i < 100; i++) { 
    unsorted[i] = rand() % 100; 
    } 
    int sorted[100] = {}; 
    for (int i = 0; i < 100; i++) { 
    int hi = -1; 
    int hiIndex = -1; 
    for (int j = 0; j < 100; j++) { 
     if (unsorted[j] > hi) { 
     hi = unsorted[j]; 
     hiIndex = j; 
     } 
    } 
    sorted[i] = hi; 
    unsorted[hiIndex] = -1; 
    } 
} 

繼承人而來的問題:

  • 這是排序算法的一些經典的和已知的一個?如果是的話,它的名字是什麼,我在哪裏可以找到一個參考來閱讀它。在這篇參考文獻中,如果我能夠找到關於該算法效率的討論,那將是非常好的。

  • 如果它不是一個經典的排序算法,我想幫助理解其邏輯,並再次瞭解效率。

+0

Something像'選擇排序'。 – danche

回答

0

這似乎是一個相當簡單但效率低下的算法,它在輸入數組上進行多次遍歷並將找到的最大數移到另一個數組中。如果你正在尋找一個排序算法,這是非常低效的,並使用額外的空間。您可能想要研究更有效的工具,如Quick SortMerge Sort

0

排序算法非常類似於選擇排序。它具有O(n²)的(相當差的)運行時間。

但是,由於它與兩個數組一起工作,所以該實現比「正常」更糟:原始數據和已排序數據。通常,選擇排序是in-place(只有一個數組)。這具有內部循環可以跳過已經排序的數組元素的好處。

此實現的另一個缺點是它不適用於負數。但也許這不是必需的。

+1

選擇排序具有O(n^2)時間複雜度。 –

+0

對不起,這是一個錯字。我只是糾正它 – Aloso

2

這不是任何經典的算法,但類似於一個,這是衆所周知的選擇排序。在內循環每次迭代的給定代碼示例中,我們查找未排序數組中的最高數字,並將其放入排序數組中的第i個索引,然後在未排序數組中將此數字設置爲-1。 例如考慮給定的數組

未排序:5,7,2,9,6 排序數組:

外部循環的第一次迭代之後:I = 0,HI = 9,hiIndex = 3

未排序:5,7,2,-1,6 排序:9

後的外部循環的第二次迭代中:i = 1,HI = 7,hiIndex = 1

未排序:5, -1,2,-1,6 s orted:9,7

您可以看到隨着時間的推移,我們按排序的數組中的降序排列列表。

該算法的時間複雜度爲O(n^2),這不是排序數組的有效方法。如果數組中有負數,則此算法將失敗,例如,上述算法無法對此列表進行排序{1,5,5,7,-9],因爲-1大於-5和-9