線性時間排序

2021-06-26 15:17:24 字數 2456 閱讀 1166

public void  radixsort(int a )

a[++k]=key;

}} }

我們前面提到的方法,基本上都是比較排序,本篇介紹三種非比較型別的排序,計數排序、基數排序、桶排序,比較排序的最壞的情況都是經過nlgn的,線性排序的時間複雜度基本上都是線性關係。

1.計數排序

計數排序不是通過元素之間的比較,而是採用輔助陣列,c,長度為k,注意其儲存方式並不是從0開始儲存,這種存貯類似於雜湊表的開放定址的方法,對a陣列進行排序,遍歷陣列a,每乙個元素都是在c中對應的c[a[i]]加1,因此陣列c的j位置就是記錄的a中值為j的元素出現的次數。然後c[j]=c[j-1]+c[j],每個c中元素為小於等於j的元素個數,也是在陣列中的儲存位置,然後遍歷a,在c中尋找a[i]的位置,然後c[a[i]]-1,(小於等於他的數少了一),輸出到b中排好序的陣列。注意:遍歷a的時候要從後向前遍歷,因為,重複元素在c中提取出來的靠後邊放置,要保證穩定性,兩個重複元素在排序前後的相對位置不能改變。基數排序這種輔助陣列的儲存方式是關鍵,使用計數排序的情況,陣列a中的元素都是小區間的整數。時間複雜度:k+n;下面是**:

* 計數排序並不是比較排序,其借助輔助陣列c,儲存方式類似於雜湊表的開放定址法

* 下標i代表 a陣列中的對應元素i的值

*/public void countsort(int a,int p,int r)

system.arraycopy(b,0, a, p, len);

/*********計數排序的原址排序******/

/* for(int i=0,n=p;i<40;i++)

while(c[i]!=0)*/}

計數排序的穩定性只有當排序的資料還附帶衛星資料時才比較重要。還有計數排序常用作基數排序的乙個子過程。因為基數排序(多關鍵字的)需要對每乙個關鍵字進行穩定排序。

2.基數排序

基數排序也就是多關鍵字排序,是一種用在卡片排序機上的演算法,先按照最低有效位進行排序,常用作撲克牌、日期的排序。如果使用計數排序時間複雜度為:d(n+k)

**鏈式基數排序是借助分配和收集兩種操作對但邏輯關鍵字進行排序的一種內部排序方法,時間複雜度是:d(n+rd),rd為基數(即關鍵字的範圍,輔助陣列大小)。每一次分配收集都要借助兩個輔助陣列,長度為基數(關鍵字的取值範圍)。每個陣列元素存放排序元素的結構體所在下標,使用鍊錶方式儲存。其實質原來元素還是在原鍊錶(陣列)的位置,只是改變的next的值,這樣就虛擬了乙個鍊錶。排序其實就是改變的每個節點next的值,表示在陣列的哪乙個位置。

以上就是鍊錶:一般來說總是想到鍊錶就想到指標指向下乙個鍊錶,其實也可以用下標表示next,此時所有元素都是儲存在陣列中的。因此不用改變陣列中元素位置,只是設定個頭結點,讓他next就是一下個元素。

3.桶排序

桶排序假設輸入的資料服從均勻分布,平均情況下的時間代價為:n;桶排序將[0,1)區間劃分為n個相同大小的子區間,稱為桶,然後將輸入的n個元素分別放入n個桶中,因為資料均勻分布,所以不會出現許多資料出現在乙個桶中,線先對每個桶進行排序,再遍歷每個桶取出資料,這裡桶中資料用鍊錶儲存。

總結:計數排序這中儲存陣列的規則很關鍵,特定元素值對映到特定的輔助陣列的位置,直接計數。不用那種n的平方的時間複雜度。

線性時間排序

在最壞情況下任何比較排序演算法都需要做 nlgn 次比較 計數排序 假設輸入的資料都屬於乙個小區間內的整數 counting sort a,b,k 1.let c 0.k be a new array 2.for i 0 to k 3.c i 0 4.for j 1 to a.length 5.c ...

線性時間排序

決策樹模型 用處 證明基於比較的排序的時間複雜度為 nlgn 簡單描述 二叉樹,有n 個葉節點,則此樹在最茂盛的時候有最小的高度h lg n nlgn 因此至少需要nlgn次比較 計數排序 描述 對n個位於區間 0,k 的元素進行排序,複雜度為o n k 的穩定排序 c 11 include inc...

線性時間排序習題

1.設計乙個演算法,對n個介於0 k之間的數進行預處理,然後能夠在o 1 的時間給出有多少個元素介於 a,b 之間 首先肯定要考慮a,b和k的相對大小,這裡就假設01.參照級數排序累計統計 2.對累計統計的結果中計算c b c a 1 2.插入排序,歸併排序,堆排序和快速排序那些是穩定的,有沒有一種...