時空權衡之計數排序

2022-08-17 21:15:15 字數 1675 閱讀 4727

計數排序是輸入增強的乙個例子,針對待排序列表(a)的每乙個元素,算出列表中小於該元素的元素個數,並把結果記錄在一張表(count)中,個數之處了該數在有序表中的位置。

例如:a[7]=

其中62有3個數字小於62,分別是19 31 47,a[0]=62,count[0]=3,這裡3就是小於62的數的個數。

演算法流程:

for  i<-0  to n-1 do count[i]<-0

for  i<-0  to n-2 do

for  j<-i+1  to n-1 do

if a[i]count[j]<-count[j]+1

else

count[i]<-count[i]+1

for  i<-0  to n-1  so s[count[i]]<-a[i]

#includeusing

namespace

std;

intmain()

//輸入資料

for(i=0;i<=n-2;i++)

else

count[i]++;}}

for(i=0;i<=n-1;i++)

s[count[i]]=a[i];

for(i=0;i)

cout

}

演算法的效率如何?

該演算法的基本操作為if(a[i]考慮另外一種計數方法:分布計數

這種排序方法是線性效率的,用空間換時間、利用輸入列表的特性,使得效率大大提公升。

演算法偽**:

distributioncountingsort(a[0...n-1],l,u)

//分布計數法,對來自有限範圍整數的乙個陣列進行排序

//輸入:陣列a[0..n-1],陣列的整數字於l和u之間

//輸出:a中的元素構成的非降序陣列s[0..n-1]

for  j<-0 to u-1  do  d[j]<-0

for  i<-0 to  n-1  do  d[a[i]-l]++;

for  j<-1 to  u-l  do  d[j]=d[j-1]+d[j]//重新計算分布

for  i<-n  downto   0  do 

j<-a[i]-l

s[d[j]-1]<-a[i]

d[j]<-d[j]-1

return s

#includeusing

namespace

std;

intmain()

//輸入資料

intd;

d=u-l;//

陣列元素最大值與最小值的差值

for(j=0;j<=d;j++)//

統計分布計數的陣列

d[j]=0

;

for(i=0;i<=n-1;i++)//

對a[i]的元素統計計數

d[a[i]-l]++;

for(j=1;j<=d;j++)//

重新計算計數

d[j]=d[j-1]+d[j];

for(i=n-1;i>=0;i--)

for(i=0;i)

cout

<"";

return0;

}

明顯這是效率為線性的乙個演算法,這是遇到過時間效率最好的演算法,但是顯然需要的空間比較多

演算法之計數排序

核心思想 通過計算某個資料之前有多少個資料來確定自身的位置,不通過資料之間的相互比較,所以是非比較排序。原始計數排序 時間複雜度 o n k k為資料量 缺點 如果資料只有兩個,9999,10000,那麼會額外建立容量為10000的陣列,浪費空間。public static int countsor...

演算法之計數排序

原理 用乙個陣列記錄待排序陣列 現的數字。最低位代表最小值,偏移量是記錄陣列中的下標 待排序陣列 2 1 4 可以表示為 記錄陣列 1 1 0 1 陣列長度為 4 1 1 然後根據記錄陣列輸出結果 public static void countsort int arr if arr.length ...

排序演算法之計數排序

今在學習中,遇到計數排序演算法,雖然其對待排序的序列要求嚴格,但對於符合條件的序列來說,其時間複雜度很小。故列於此,僅為學習記憶。參考資料 對於僅由大寫字母 或小寫字母 構成的無序序列,可採用下面演算法進行排序。該演算法不在序列的每個元素間進行比較,而是使用了乙個額外的help整型字串來記錄每個元素...