線性時間排序演算法

2022-06-01 01:00:15 字數 1076 閱讀 5578

繼續上一次的排序演算法的總結,今天帶來的是線性時間排序演算法

可以看到,我們之前的交換演算法時間複雜度最少也只是o(nlogn),那麼有沒有o(n)的時間複雜度的演算法呢,也是有的,就是線性時間排序演算法。常見的線性時間演算法有:計數排序,基數排序和桶排序,而基數排序和桶排序十分類似,這裡只介紹更為普遍的基數排序。

①計數排序

(1)演算法思想:計數排序的演算法思想比較簡單,即我們把序列中乙個數之前有多少個數字統計出來,然後直接把這個數放到相應的位置的演算法。這種演算法的空間要求比較高,因為需要乙個陣列來儲存從0到序列中最大的數的之前的數的個數,所以空間消耗很大。

(2)時間複雜度:o(n^2)

(3)演算法描述(吸取教訓,從這篇博文開始**加備註~):

void countinsort(int a, int b, int n, int max)

}

②基數排序

(1)演算法思想:基數排序的演算法思想是對於序列中的每個數從低位開始互相比較,然後產生新的序列,然後對新的序列的高位互相比較,繼續產生新的數列,最後對每一位比較完畢後產生最終的數列。具體例項如圖所示

(2)時間複雜度:o(n^2)

(3)演算法描述:

int getpos(int n, int pos)

int radixsort(int a, int n)

for(int pos = 1; pos <= 10; pos ++)

for(i = 0, j =0; i < 10; i++)

b[i][0] = 0; //重新初始化計數元素

} }return 0;

}

③桶排序

桶排序和基數排序類似,是將數字分成n個桶,然後將每個數字除以n然後得到的數放在相應的桶裡,對每個非空的桶進行快排,之後順序存入新的陣列。產生最後排好序的數列。

排序演算法就說這麼多,其實還有一種堆排序也十分常用,但是苦於資料結構的樹形結構還未學習,所以暫時不予介紹,待再啃啃資料結構回頭再來總結。

線性時間排序演算法

基於比較的演算法的時間下限為nlogn,而計數排序 桶排序和基數排序這幾種非比較演算法卻可以突破這個下限,僅管它們對輸入都有一定限制條件,即輸入資料必須在某個範圍內。但是,這些演算法還是非常實用的。閒著沒事,寫了一下 詳細見 演算法導論 define no cmp sort ifdef no cmp...

線性時間排序演算法

基於比較的演算法的時間下限為nlogn,而計數排序 桶排序和基數排序這幾種非比較演算法卻可以突破這個下限,僅管它們對輸入都有一定限制條件,即輸入資料必須在某個範圍內。但是,這些演算法還是非常實用的。閒著沒事,寫了一下 詳細見 演算法導論 define no cmp sort ifdef no cmp...

排序演算法 4 線性時間排序

在前面三節排序演算法中,我們分別分析了不同策略,思想用於排序,而這些演算法都是基於資料間的比較來確定順序的。假設我不用比較,換一種思路,那麼就可以達到時間複雜度為o n 的排序演算法,當然是以付出額外的空間為代價的。線性時間排序的演算法思想 1 在計數排序中,利用比x小或等的元素個數和的來確定x位置...