Java排序算法之計數(shù)排序解析
Java計數(shù)排序解析
原理:找到數(shù)組中數(shù)值最大的元素,(如這里的8),創(chuàng)建一個長度為最大元素+1的臨時數(shù)組,(這里為9),這樣就可以把原始數(shù)組轉(zhuǎn)換為: 以原始數(shù)組元素值為下標(biāo),相同元素個數(shù)為值的臨時數(shù)組 如數(shù)組 [8,4,2,3,5] 經(jīng)過轉(zhuǎn)換后形成了 [0,0,1,1,1,1,0,0,1] 的數(shù)組,如下圖:

但是在一些情況下,這樣創(chuàng)建數(shù)組是不合適的,如[90,96,92,93,95] ,這就需要創(chuàng)建一個長度為97的數(shù)組,而這個數(shù)組前90個位置就被浪費了,所以可以進(jìn)行優(yōu)化
優(yōu)化:用數(shù)組的最大值減去最小值,創(chuàng)建一個長度為差值+1的數(shù)組,保存每個元素時保存相對大小,如上面這個數(shù)組,差值為8-2=6,創(chuàng)建一個長度為7的數(shù)組,用每個元素減去最小值,然后用結(jié)果去轉(zhuǎn)換為下面的數(shù)組

代碼實現(xiàn)(java):
//測試
public static void main(String[] args) {
int[] arr = {8,4,2,2,3,3,5};
countSort(arr);
}
public static void countSort(int[] arr){
//1.取出數(shù)組中的最大值和最小值
int max = arr[0];
int min = arr[0];
for (int i = 0; i < arr.length - 1; i++) {
if (arr[i] < min) {
min = arr[i];
}
if (arr[i] > max) {
max = arr[i];
}
}
//最大值和最小值的差值
int len = max - min;
//創(chuàng)建差值+1長度的臨時數(shù)組
int[] tmp = new int[len + 1];
//遍歷原數(shù)組,將(元素-最小值)作為下標(biāo),元素個數(shù)為value,插入到臨時數(shù)組
for (int i : arr) {
tmp[i-min] ++;
}
//遍歷臨時數(shù)組,每個下標(biāo)為值,元素值為次數(shù),依次打印
for (int i = 0; i < tmp.length; i++) {
for (int j = i; j < tmp[i]+i; j++) {
System.out.println(j + min);
}
}
}到此這篇關(guān)于Java排序算法之計數(shù)排序解析的文章就介紹到這了,更多相關(guān)Java計數(shù)排序解析內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot實現(xiàn)發(fā)送郵件功能的三種方式
本文詳細(xì)介紹了如何在SpringBoot應(yīng)用中使用JavaMailSender、JavaMailAPI和ApacheCommonsEmail庫發(fā)送郵件,對比了它們的優(yōu)缺點,并提供了示例代碼和配置指導(dǎo),需要的朋友可以參考下2025-07-07
Java中==運算符與equals方法的區(qū)別及intern方法詳解
這篇文章主要介紹了Java中==運算符與equals方法的區(qū)別及intern方法詳解的相關(guān)資料,需要的朋友可以參考下2017-04-04
springmvc字符編碼過濾器CharacterEncodingFilter的使用
這篇文章主要介紹了springmvc字符編碼過濾器CharacterEncodingFilter的使用,具有很好的參考價值,希望對大家有所幫助。2021-08-08
SpringCloud實戰(zhàn)之Zuul網(wǎng)關(guān)服務(wù)
服務(wù)網(wǎng)關(guān)是分布式架構(gòu)中不可缺少的組成部分,是外部網(wǎng)絡(luò)和內(nèi)部服務(wù)之間的屏障。這篇文章主要介紹了SpringCloud實戰(zhàn)之Zuul網(wǎng)關(guān)服務(wù)。一起跟隨小編過來看看吧2018-05-05
Java線程局部變量ThreadLocal的核心原理與正確實踐指南
ThreadLocal是一個強(qiáng)大而精巧的工具,它通過線程隔離數(shù)據(jù)的方式,優(yōu)雅地解決了特定場景下的線程安全問題,本文給大家介紹Java線程局部變量ThreadLocal的核心原理與正確實踐指南,感興趣的朋友跟隨小編一起看看吧2025-11-11

