演算法基礎複習 RadixSort

2021-07-24 07:31:07 字數 1311 閱讀 2472

前言:為了後續的實習面試,開始瘋狂刷題,非常歡迎志同道合的朋友一起交流。因為時間比較緊張,目前的規劃是先過一遍,寫出能想到的最優演算法,第二遍再考慮最優或者較優的方法。如有錯誤歡迎指正。博主首發csdn,mcf171專欄。

——————————————————————————————

基數排序

總體思路是:

基數排序的時間複雜度是o(k·n),其中n是排序元素個數,k是數字位數。這個時間複雜度一定優於o(n·log(n)),k的大小取決於數字位的選擇(比如位元位數),和待排序資料所屬資料型別的全集的大小;k決定了進行多少輪處理,而n是每輪處理的運算元目。

以排序n個不同整數來舉例,假定這些整數以b為底,這樣每位數都有b個不同的數字,k = logb

(n),n是待排序資料型別全集的勢。雖然有b個不同的數字,需要b個不同的桶,但在每一輪處理中,判斷每個待排序資料項只需要一次計算確定對應數字的值,因此在每一輪處理的時候都需要平均n次操作來把整數放到合適的桶中去,所以就有:

所以,基數排序的平均時間t就是:

t~= log

b(n)·

n其中前一項是乙個與輸入資料無關的常數,當然該項不一定小於logn

如果考慮和比較排序進行對照,基數排序的形式複雜度雖然不一定更小,但由於不進行比較,因此其基本操作的代價較小,而且在適當選擇的b之下,k一般不大於logn,所以基數排序一般要快過基於比較的排序,比如快速排序。

public static void radixsort(int array)

int count = new int[10];

list> bucket = new arraylist>();

for(int j = 0 ; j < 10; j ++) bucket.add(new arraylist());

for(int i = 0 ; i < array.length; i ++)

int index = 1;

for(int i = 1; i < itercount; i ++)else subscript ++;}}

index ++;

for(int j = 0; j < bucket.size();j ++) count[j] = bucket.get(j).size();

}index = 0;

for(int i = 0; i < bucket.size(); i ++)}}

public static int getvalue(int position,int value)

return position >= 0 ? value % 10 : -1;

}

基礎排序演算法複習

1.計數排序 計數排序的四個步驟 a.初始化c 0 k 為0 b.對於每個元素a i c a i c記錄a中各個元素出現的次數,比如中,c 1 2,c 2 0,c 3 1 c.對於i 1 to k,c i c i c i 1 此時c記錄小於等於i的元素的個數,c 1 2,c 2 2,c 3 3 d....

演算法基礎複習 QuickSort

前言 為了後續的實習面試,開始瘋狂刷題,非常歡迎志同道合的朋友一起交流。因為時間比較緊張,目前的規劃是先過一遍,寫出能想到的最優演算法,第二遍再考慮最優或者較優的方法。如有錯誤歡迎指正。博主首發csdn,mcf171專欄。發現自己的基礎有點不牢,複習一下基本的演算法。quicksort的時間複雜度最...

演算法基礎複習 InsertionSort

前言 為了後續的實習面試,開始瘋狂刷題,非常歡迎志同道合的朋友一起交流。因為時間比較緊張,目前的規劃是先過一遍,寫出能想到的最優演算法,第二遍再考慮最優或者較優的方法。如有錯誤歡迎指正。博主首發csdn,mcf171專欄。一般來說,插入排序都採用in place在陣列上實現。具體演算法描述如下 從第...