Java排序算法之計(jì)數(shù)排序解析
Java計(jì)數(shù)排序解析
原理:找到數(shù)組中數(shù)值最大的元素,(如這里的8),創(chuàng)建一個(gè)長(zhǎng)度為最大元素+1的臨時(shí)數(shù)組,(這里為9),這樣就可以把原始數(shù)組轉(zhuǎn)換為: 以原始數(shù)組元素值為下標(biāo),相同元素個(gè)數(shù)為值的臨時(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] ,這就需要?jiǎng)?chuàng)建一個(gè)長(zhǎng)度為97的數(shù)組,而這個(gè)數(shù)組前90個(gè)位置就被浪費(fèi)了,所以可以進(jìn)行優(yōu)化
優(yōu)化:用數(shù)組的最大值減去最小值,創(chuàng)建一個(gè)長(zhǎng)度為差值+1的數(shù)組,保存每個(gè)元素時(shí)保存相對(duì)大小,如上面這個(gè)數(shù)組,差值為8-2=6,創(chuàng)建一個(gè)長(zhǎng)度為7的數(shù)組,用每個(gè)元素減去最小值,然后用結(jié)果去轉(zhuǎn)換為下面的數(shù)組

代碼實(shí)現(xiàn)(java):
//測(cè)試
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長(zhǎng)度的臨時(shí)數(shù)組
int[] tmp = new int[len + 1];
//遍歷原數(shù)組,將(元素-最小值)作為下標(biāo),元素個(gè)數(shù)為value,插入到臨時(shí)數(shù)組
for (int i : arr) {
tmp[i-min] ++;
}
//遍歷臨時(shí)數(shù)組,每個(gè)下標(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排序算法之計(jì)數(shù)排序解析的文章就介紹到這了,更多相關(guān)Java計(jì)數(shù)排序解析內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot查看項(xiàng)目配置信息的幾種常見方法
這篇文章主要為大家詳細(xì)介紹了查看Spring Boot項(xiàng)目所有配置信息的幾種方法,包括 Actuator端點(diǎn),日志輸出,代碼級(jí)獲取等方式并附帶詳細(xì)步驟和示例,希望對(duì)大家有一定的幫助2025-04-04
SpringBoot實(shí)現(xiàn)發(fā)送郵件功能的三種方式
本文詳細(xì)介紹了如何在SpringBoot應(yīng)用中使用JavaMailSender、JavaMailAPI和ApacheCommonsEmail庫(kù)發(fā)送郵件,對(duì)比了它們的優(yōu)缺點(diǎn),并提供了示例代碼和配置指導(dǎo),需要的朋友可以參考下2025-07-07
Java stringBuilder的使用方法及實(shí)例解析
這篇文章主要介紹了Java stringBuilder的使用方法及實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09
Java中==運(yùn)算符與equals方法的區(qū)別及intern方法詳解
這篇文章主要介紹了Java中==運(yùn)算符與equals方法的區(qū)別及intern方法詳解的相關(guān)資料,需要的朋友可以參考下2017-04-04
springmvc字符編碼過濾器CharacterEncodingFilter的使用
這篇文章主要介紹了springmvc字符編碼過濾器CharacterEncodingFilter的使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。2021-08-08
SpringCloud實(shí)戰(zhàn)之Zuul網(wǎng)關(guān)服務(wù)
服務(wù)網(wǎng)關(guān)是分布式架構(gòu)中不可缺少的組成部分,是外部網(wǎng)絡(luò)和內(nèi)部服務(wù)之間的屏障。這篇文章主要介紹了SpringCloud實(shí)戰(zhàn)之Zuul網(wǎng)關(guān)服務(wù)。一起跟隨小編過來看看吧2018-05-05
Java線程局部變量ThreadLocal的核心原理與正確實(shí)踐指南
ThreadLocal是一個(gè)強(qiáng)大而精巧的工具,它通過線程隔離數(shù)據(jù)的方式,優(yōu)雅地解決了特定場(chǎng)景下的線程安全問題,本文給大家介紹Java線程局部變量ThreadLocal的核心原理與正確實(shí)踐指南,感興趣的朋友跟隨小編一起看看吧2025-11-11

