排序演算法 6 計數排序

2021-08-07 20:41:42 字數 2051 閱讀 5686

不知道為什麼,突然編輯器不支援顏色豐富的intellij idea直接複製了,博主有點沮喪,因此我先用的形式展示並分析,然後在最後會將全部**呈上

排序思想:在乙個陣列中,對於每乙個資料,都統計有多少個數字小於它,就能反應出它當前所在的位置

比如 [0,1,1,2] 這個陣列中,'0'就有0個元素小於它,'2'就有3個元素小於它,而對於'1',則有2個元素小於它.

從以下方面不斷進步著:

基礎**

一次改進,將排序適配範圍擴大

二次改進,更舒服的使用這個演算法

全部**

一.基礎**

二.一次改進,將排序適配範圍擴大

在這裡,將適配範圍增加,但是遺憾的是依舊只能對正整數進行排序

三.二次改進,更舒服的使用這個演算法

四.全部**

package com.sort;

/** * 計數排序

* 對於每乙個資料,統計整個陣列中有多少小於它的數,這樣就可以確定它的位置.

* 比如 : 比它小的有17個,那麼它就應該在第18位上

*/public class countingsort

}int result = new int[arr.length]; //作為排序完成的陣列

int temp = new int[max + 1]; //用於儲存臨時資料

// 這裡將 temp 的下標作為待排陣列中的數值,而它對應的元素作為這個數值在陣列中的頻數

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

// 更新 temp 陣列,將它儲存的元素表示為:有多少元素小於(或等於)當前下標的值

for (int i = 1; i <= max; i++)

//將結果輸出到 result 中

for (int i = arr.length - 1; i >= 0; i--)

return result;

}/*改進1:

* 觀察上述**,很明顯能得到,上面真正能夠執行的情況僅能排序的區間是 [ 1 , max ]

* 侷限性很大,因此這裡進行改進

* 改進後的排序演算法可以排序的區間是 [ min , max ]

*///傳遞進來兩個引數,說明排序區間為 [ min , max ]

public static int countingsort_2(int arr, int min, int max)

// 更新 temp 陣列,將它儲存的元素表示為:有多少元素小於(或等於)當前下標的值

for (int i = 1; i <= max - min; i++)

//將結果輸出到 result 中

for (int i = arr.length - 1; i >= 0; i--)

return result;

}/*改進2:

* 這次改進的不是**本身,而是操作習慣.

* 一般而言,當我想呼叫乙個陣列對他進行排序的時候,通常不會而且不想知道它的最小值和最大值,

* 因此找到最小值和最大值的這一步需要我們用**實現

** 改進之後,可以直接傳入陣列進行排序

*/public static int countingsort_3(int arr) else if (anarr < min)

}return countingsort_2(arr, min, max);}}

演算法 排序 計數排序

計數排序不是基於比較的排序演算法,其核心在於將輸入的資料值轉化為鍵儲存在額外開闢的陣列空間中。作為一種線性時間複雜度的排序,計數排序要求輸入的資料必須是有確定範圍的整數。計數排序 counting sort 是一種穩定的排序演算法。計數排序使用乙個額外的陣列c,其中第i個元素是待排序陣列a中值等於i...

演算法 排序 計數排序

計數排序的核心思想就是將需要排序的陣列的元素轉為下標,在輔助空間陣列 輔助空間陣列的初始都是0 中找到對應元素的下標位置,將該位置的元素 掃瞄下標,將對應不為0的下標記錄賦值給原陣列,然後對應下標元素 圖例分析 具體 includevoid countsort int a,int len int m...

計數排序演算法

countsort.c include include include typedef int datatype typedef char numtype 有效個數 2至127 2 sizeof numtype 8 1 1 define limit numtype 1 sizeof numtype ...