## **計數排序**
計數排序不是基于比較的排序算法,其核心在于將輸入的數據值轉化為鍵存儲在額外開辟的數組空間中。 作為一種線性時間復雜度的排序,計數排序要求輸入的數據必須是有確定范圍的整數。
## **算法描述**
1. 找出待排序的數組中最大和最小的元素;
2. 統計數組中每個值為i的元素出現的次數,存入數組C的第i項;
3. 對所有的計數累加(從C中的第一個元素開始,每一項和前一項相加);
4. 反向填充目標數組:將每個元素i放在新數組的第C(i)項,每放一個元素就將C(i)減去1。
## **穩定性**
最后給 b 數組賦值是倒著遍歷的,而且放進去一個就將C數組對應的值(表示前面有多少元素小于或等于A\[i\])減去一。如果有相同的數x1,x2,那么相對位置后面那個元素x2放在(比如下標為4的位置),相對位置前面那個元素x1下次進循環就會被放在x2前面的位置3。從而保證了穩定性。
## **適用場景**
排序目標要能夠映射到整數域,其最大值最小值應當容易辨別。例如高中生考試的總分數,顯然用0-750就OK啦;又比如一群人的年齡,用個0-150應該就可以了,再不濟就用0-200嘍。另外,計數排序需要占用大量空間,它比較適用于數據比較集中的情況。
## **JAVA代碼實現**
```
public static void countSort(int[] a, int max, int min) {
int[] b = new int[a.length];//存儲數組
int[] count = new int[max - min + 1];//計數數組
for (int num = min; num <= max; num++) {
//初始化各元素值為0,數組下標從0開始因此減min
count[num - min] = 0;
}
for (int i = 0; i < a.length; i++) {
int num = a[i];
count[num - min]++;//每出現一個值,計數數組對應元素的值+1
}
for (int num = min + 1; num <= max; num++) {
//加總數組元素的值為計數數組對應元素及左邊所有元素的值的總和
count[num - min] += sum[num - min - 1]
}
for (int i = 0; i < a.length; i++) {
int num = a[i];//源數組第i位的值
int index = count[num - min] - 1;//加總數組中對應元素的下標
b[index] = num;//將該值存入存儲數組對應下標中
count[num - min]--;//加總數組中,該值的總和減少1。
}
//將存儲數組的值一一替換給源數組
for(int i=0;i<a.length;i++){
a[i] = b[i];
}
}
```
- JDK常用知識庫
- JDK各個版本安裝
- Java8流
- 算法
- 十大排序算法
- 冒泡排序
- 選擇排序
- 插入排序
- 歸并排序
- 快速排序
- 堆排序
- 希爾排序
- 計數排序
- 桶排序
- 基數排序
- 總結
- 常用工具類
- 浮點型計算
- 時間格式處理
- 常用功能點思路整理
- 登錄
- 高并發
- 線程安全的單例模式
- Tomcat優化
- Tomcat之APR模式
- Tomcat啟動過慢問題
- 常用的數據庫連接池
- Druid連接池
- 緩存
- Redis
- SpringBoot整合Redis
- 依賴和配置
- RedisTemplate工具類
- 工具類使用方法
- Redis知識庫
- Redis安裝
- Redis配置參數
- Redis常用Lua腳本
- MongoDB
- SpringBoot操作MongoDB
- 依賴和配置
- MongoDB工具類
- 工具類使用方法
- 消息中間件
- ActiveMq
- SpringBoot整合ActiveMq
- 框架
- SpringBoot
- 定時任務
- 啟動加載
- 事務
- JSP
- 靜態類注入
- SpringSecurity
- Shiro
- 配置及整合
- 登陸驗證
- 權限驗證
- 分布式應用
- SpringMVC
- ORM框架
- Mybatis
- 增
- 刪
- 改
- 查
- 程序員小笑話
- 我給你講一個TCP的笑話吧
- 二進制笑話
- JavaScript的那點東西
- JavaScript內置對象及常見API詳細介紹
- JavaScript實現Ajax 資源請求
- JavaScript干貨
- 架構師成長之路
- JDK源碼解析
- ArrayList源碼解讀
- 設計模式
- 微服務架構設計模式
- 逃離單體煉獄
- 服務的拆分策略
- 全面解析SpringMvc框架
- 架構設計的六大原則
- 并發集合
- JUC并發編程
- 搜索引擎
- Solr
- Solr的安裝
- 分布式服務框架
- Dubbo
- 從零開始學HTMl
- 第一章-初識HTML
- 第二章-認識HTML標簽