線性排序之 計數排序

2021-06-25 13:25:42 字數 2731 閱讀 6809

counting sort適用於排列分布比較集中的資料, 即最大值和最小值相差不會太大,具體這個差在多少合適,還是以後值得我思考的問題??

計數排序的演算法思想是需要分配3個陣列,original, counter[original], counter[i] = counter[i]+counter[i-1], 即計數為小於等於本身值的個數,通過從累加小於i的項,

最後依照counter作為pos, 將original分布到result中, 再將result拷貝到original

result[counter[original[k]]-1] = original[k];

counter[original[k]]--;

演算法分析:

1.時間複雜度為 o(n)。

2.空間複雜度為 o(n)。

3.計數排序不是原地排序演算法(指不申請多餘的空間來進行的排序);

穩定排序演算法(指在排序前後具有相同關鍵字之間的相對順序保持不變);

1. c++實現的源**如下:

class countsort //計數排序類

;

countsort::countsort():length(len)

} int *counter = new int[max+1];//counter陣列記錄陣列中每個元素出現的次數, 0-max

memset(counter,0,(max+1)*sizeof(int)); //assign space and init it to 0

int *result = new int[max+1]; //result陣列存放排好序的元素

memset(result,0,(max+1)*sizeof(int));

//step1: map original[i] as the mark of counter

for(int i = 0; i sort();

cout<

2 .由於空間申請了o(3n), 所以需要對空間進行優化,合併step 2,3,4,

} int *counter = new int[max+1];//counter陣列記錄陣列中每個元素出現的次數, 0-max

memset(counter,0,(max+1)*sizeof(int)); //assign space and init it to 0

//step1: map original[i] as the mark of counter

for(int i = 0; i 0)

}delete counter;

}3. 更進一步的優化演算法

如果最大數和最小數基數很大,但是|max-min| 差別比較小,或者出現了負數的時候怎麼處理。

可以通過雜湊函式來代替第一步值與counter索引對映。original[i]= xi, counter[j]

對於直接對映即j=xi,所以h(xi) = xi;

那麼如果是max和min都是正數,且min本身就很大,

j = xi-min=h(xi),    如果min是負數,這個問題留到以後再解決吧。。。

現在基於上面的**進行驗證。我們生成1000-2000的隨機數, 如果令index = original[i], 那麼現在的index = original[i] -min,

**實現如下

void countsort::sort()  

if(original[i]< min)

}int length2 = max - min +1;

int *counter = new int[length2];//counter陣列記錄陣列中每個元素出現的次數, 0-max

memset(counter,0,(length2)*sizeof(int)); //assign space and init it to 0

int *result = new int[length]; //result陣列存放排好序的元素

memset(result,0,(length)*sizeof(int));

//step1: map original[i] as the mark of counter

for(int i = 0; i

//step 2: accumulate counter

for(int j = 1; j <= length2 -1; j++)

//step 3: distribute counter to result

for(int k = 0; k < length; k++)

//step4:copy result to original, has equal length

for(int m = 0; m < length; m++)

delete counter;

delete result;

}

排序演算法(五) 線性時間排序之計數排序

計數排序假設n個輸入元素中的每乙個都是介於0到k之間的整數,此處k為某個整數。當k o n 時,計數排序的執行時間為o n 計數排序的基本思想是 對於每乙個輸入元素x,確定小於x的元素個數。利用這一資訊,就可以直接把x放到輸出陣列中的位置上了。例如,如果有17個元素小於x則x就應該放在第18個位置上...

排序演算法之計數排序

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

演算法 排序之計數排序

最近想到演算法導論中的計數排序,看看理解的怎麼樣試著講講自己的理解。1 思想 計數排序 是 線性時間的 排序演算法,時間複雜度為o n 雖然有一定的侷限性。但是還是很好的一種演算法。用2個陣列進行額外的儲存資訊,陣列 c 是對 資料中值相同的 記錄下來,以便後面查閱 b 是輸出的有序陣列,再將有序的...