国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【排序算法】 計(jì)數(shù)排序(非比較排序)詳解!了解哈希思想!

這篇具有很好參考價(jià)值的文章主要介紹了【排序算法】 計(jì)數(shù)排序(非比較排序)詳解!了解哈希思想!。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

【排序算法】 計(jì)數(shù)排序(非比較排序)詳解!了解哈希思想!,# 排序篇,哈希算法,排序算法,算法,c語言,開發(fā)語言

?? 嶼小夏 : 個(gè)人主頁
??個(gè)人專欄 : 算法—排序篇
?? 莫道桑榆晚,為霞尚滿天!

??前言

什么是計(jì)數(shù)排序?計(jì)數(shù)排序的思想是什么?它是如何實(shí)現(xiàn)的?

本文會(huì)對(duì)計(jì)數(shù)排序進(jìn)行由淺入深的探究,讓你徹底掌握計(jì)數(shù)排序!

???計(jì)數(shù)排序的概念

??什么是計(jì)數(shù)排序?

? 計(jì)數(shù)排序又稱為鴿巢原理,是對(duì)哈希直接定址法的變形應(yīng)用。

? 統(tǒng)計(jì)每個(gè)元素出現(xiàn)的次數(shù),然后根據(jù)元素的大小順序?qū)⑺鼈兎湃胝_的位置。

??計(jì)數(shù)排序思想

計(jì)數(shù)排序是一種小眾的排序,它適合于數(shù)據(jù)密集的場(chǎng)景,按最大數(shù)的數(shù)值來開空間。

?絕對(duì)映射

假設(shè)現(xiàn)有一組數(shù)據(jù),最大的數(shù)據(jù)是1000,那么便會(huì)開一千個(gè)大小的空間,這種屬于絕對(duì)映射,在極端的場(chǎng)景下,極易造成空間上的浪費(fèi),比如現(xiàn)在有5,99,88,1000,8888,452,635,82,777,555,只有10個(gè)數(shù)但是最大的數(shù)是8888因此要開8888大小的空間,剩余的空間全部都浪費(fèi)了。

?相對(duì)映射

因此絕大多數(shù)情況下,都會(huì)使用相對(duì)映射。

具體的步驟如下:

  1. 找出待排序數(shù)組中的最大值和最小值,并創(chuàng)建一個(gè)計(jì)數(shù)數(shù)組,長(zhǎng)度為最大值和最小值之差加1。
  2. 遍歷待排序數(shù)組,統(tǒng)計(jì)每個(gè)元素出現(xiàn)的次數(shù),并將次數(shù)存儲(chǔ)在計(jì)數(shù)數(shù)組的相應(yīng)位置上。
  3. 對(duì)計(jì)數(shù)數(shù)組進(jìn)行累加操作,得到每個(gè)元素在排序后數(shù)組中的最終位置。
  4. 創(chuàng)建一個(gè)與待排序數(shù)組長(zhǎng)度相同的臨時(shí)數(shù)組,用于存儲(chǔ)排序后的結(jié)果。
  5. 從后向前遍歷待排序數(shù)組,根據(jù)計(jì)數(shù)數(shù)組中每個(gè)元素的值,將元素放入臨時(shí)數(shù)組的相應(yīng)位置上。
  6. 將臨時(shí)數(shù)組中的元素復(fù)制回待排序數(shù)組,完成排序。

【排序算法】 計(jì)數(shù)排序(非比較排序)詳解!了解哈希思想!,# 排序篇,哈希算法,排序算法,算法,c語言,開發(fā)語言

???計(jì)數(shù)排序的實(shí)現(xiàn)

??實(shí)現(xiàn)思路

  1. 找到數(shù)組中的最小值和最大值,以確定計(jì)數(shù)數(shù)組的大小。
  2. 然后,根據(jù)最小值和最大值計(jì)算計(jì)數(shù)數(shù)組的大小,并分配內(nèi)存空間。
  3. 接下來,將計(jì)數(shù)數(shù)組的所有元素初始化為0。
  4. 然后,遍歷原數(shù)組,統(tǒng)計(jì)每個(gè)元素出現(xiàn)的次數(shù),將統(tǒng)計(jì)結(jié)果保存在計(jì)數(shù)數(shù)組中。
  5. 接著,使用兩個(gè)循環(huán),將計(jì)數(shù)數(shù)組中的元素按照次數(shù)依次放回原數(shù)組中。
  6. 最后,釋放計(jì)數(shù)數(shù)組的內(nèi)存空間。

??代碼實(shí)現(xiàn)

//計(jì)數(shù)排序
void CountSort(int* a, int n)
{
	int min = a[0];
	int max = a[0];
	for (int i = 0; i < n; i++)
	{
		if (a[i] < min)
		{
			min = a[i];
		}
		if (a[i] > max)
		{
			max = a[i];
		}
	}
	int range = max - min + 1;
	int* count = (int*)malloc(sizeof(int) * range);
	if (count == NULL)
	{
		perror("malloc fail");
		exit(-1);
	}
	memset(count, 0, sizeof(int) * range);
	for (int i = 0; i < n; i++)
	{
		count[a[i] - min]++;
	}
	int j = 0;
	for (int i = 0; i < range; i++)
	{
		while (count[i]--)
		{
			a[j++] = i + min;
		}
	}
}

??代碼解析

  1. 尋找最小值和最大值: 首先,通過循環(huán)遍歷輸入數(shù)組 a,找到數(shù)組中的最小值 min 和最大值 max。這是為了確定排序范圍。
  2. 確定排序范圍: 計(jì)算排序范圍 range,即 (max - min + 1),這表示需要排序的整數(shù)范圍。
  3. 創(chuàng)建計(jì)數(shù)數(shù)組: 使用 malloc 函數(shù)為計(jì)數(shù)數(shù)組 count 分配內(nèi)存,該數(shù)組的大小是排序范圍 range。計(jì)數(shù)數(shù)組用于存儲(chǔ)每個(gè)整數(shù)在輸入數(shù)組中出現(xiàn)的次數(shù)。
  4. 初始化計(jì)數(shù)數(shù)組: 使用 memset 函數(shù)將計(jì)數(shù)數(shù)組 count 中的所有元素初始化為0。
  5. 計(jì)數(shù): 遍歷輸入數(shù)組 a,對(duì)于每個(gè)整數(shù) a[i],將其減去 min 的值作為索引,然后在計(jì)數(shù)數(shù)組中對(duì)應(yīng)索引位置的值加1。這一步會(huì)統(tǒng)計(jì)每個(gè)整數(shù)在輸入數(shù)組中出現(xiàn)的次數(shù)。
  6. 重構(gòu)排序數(shù)組: 使用兩個(gè)循環(huán),首先遍歷計(jì)數(shù)數(shù)組 count,然后在內(nèi)部循環(huán)中,根據(jù)計(jì)數(shù)數(shù)組中的值,將相應(yīng)數(shù)量的整數(shù)值還原到原始輸入數(shù)組 a。這將完成排序過程。

???計(jì)數(shù)排序特性總結(jié)

??時(shí)間復(fù)雜度:

計(jì)數(shù)排序的時(shí)間復(fù)雜度為 O(n+k),其中 n 是輸入數(shù)組的大小,k 是整數(shù)的范圍。它具有線性時(shí)間復(fù)雜度的優(yōu)點(diǎn),適用于整數(shù)排序,特別是當(dāng)整數(shù)范圍相對(duì)較小且分布均勻時(shí)。

??空間復(fù)雜度

計(jì)數(shù)排序的空間復(fù)雜度取決于整數(shù)范圍,為 O(k)。因此,它需要額外的空間來存儲(chǔ)計(jì)數(shù)數(shù)組,當(dāng)整數(shù)范圍較大時(shí)可能會(huì)占用較多內(nèi)存。

??穩(wěn)定性

計(jì)數(shù)排序是一種穩(wěn)定的排序算法。穩(wěn)定性意味著具有相同值的元素在排序后仍保持相對(duì)順序不變。在計(jì)數(shù)排序中,具有相同值的元素會(huì)按照它們?cè)谳斎霐?shù)組中的順序被放置在輸出數(shù)組中。

??適用性限制

計(jì)數(shù)排序僅適用于整數(shù)排序,特別是當(dāng)整數(shù)范圍相對(duì)較小且分布均勻時(shí)。它不適用于排序包含負(fù)數(shù)或浮點(diǎn)數(shù)的數(shù)組。此外,如果整數(shù)范圍過大,可能會(huì)導(dǎo)致內(nèi)存占用過多。

??不適用于大規(guī)模數(shù)據(jù)

盡管計(jì)數(shù)排序具有線性時(shí)間復(fù)雜度的優(yōu)點(diǎn),但它對(duì)于大規(guī)模數(shù)據(jù)集的排序可能并不理想。當(dāng)整數(shù)范圍非常大且分布不均勻時(shí),計(jì)數(shù)排序的性能可能會(huì)受到限制。

??總結(jié)

計(jì)數(shù)排序適用于特定范圍內(nèi)的整數(shù)排序,并且在這種情況下具有穩(wěn)定的性能表現(xiàn)。然而,在應(yīng)用計(jì)數(shù)排序時(shí),需要仔細(xì)考慮整數(shù)范圍和數(shù)據(jù)集的分布情況,以確保不會(huì)出現(xiàn)內(nèi)存占用過大或性能下降的情況。

???全篇總結(jié)

本章專門對(duì)計(jì)數(shù)排序從概念到實(shí)現(xiàn),進(jìn)行了細(xì)致入微的講解,期望對(duì)你理解掌握計(jì)數(shù)有所幫助!

看到這里希望給博主留個(gè):??點(diǎn)贊??收藏??關(guān)注!
你們的點(diǎn)贊就是博主更新最大的動(dòng)力!
有問題可以評(píng)論或者私信呢秒回哦。

【排序算法】 計(jì)數(shù)排序(非比較排序)詳解!了解哈希思想!,# 排序篇,哈希算法,排序算法,算法,c語言,開發(fā)語言文章來源地址http://www.zghlxwxcb.cn/news/detail-738904.html

到了這里,關(guān)于【排序算法】 計(jì)數(shù)排序(非比較排序)詳解!了解哈希思想!的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【排序算法】 歸并排序詳解!深入理解!思想+實(shí)現(xiàn)!

    【排序算法】 歸并排序詳解!深入理解!思想+實(shí)現(xiàn)!

    ?? 嶼小夏 : 個(gè)人主頁 ??個(gè)人專欄 : 算法—排序篇 ?? 莫道桑榆晚,為霞尚滿天! ? 什么是歸并?通過歸并排序就能讓數(shù)據(jù)有序?分治法是怎么在歸并排序上應(yīng)用的?本文將對(duì)歸并排序進(jìn)行細(xì)致入微的講解,庖丁解牛般讓你徹底明白歸并排序! 歸并排序(MERGE-SORT)是建

    2024年02月08日
    瀏覽(24)
  • 【排序算法】 歸并排序詳解!深入理解!思想+源碼實(shí)現(xiàn)!

    【排序算法】 歸并排序詳解!深入理解!思想+源碼實(shí)現(xiàn)!

    ?? 嶼小夏 : 個(gè)人主頁 ??個(gè)人專欄 : 算法—排序篇 ?? 莫道桑榆晚,為霞尚滿天! ? 什么是歸并?通過歸并排序就能讓數(shù)據(jù)有序?分治法是怎么在歸并排序上應(yīng)用的?本文將對(duì)歸并排序進(jìn)行細(xì)致入微的講解,庖丁解牛般讓你徹底明白歸并排序! 歸并排序(MERGE-SORT)是建

    2024年02月06日
    瀏覽(24)
  • 【八大排序(九)】計(jì)數(shù)排序-非比較排序法

    【八大排序(九)】計(jì)數(shù)排序-非比較排序法

    ??博主CSDN主頁:杭電碼農(nóng)-NEO?? ? ?專欄分類:八大排序?qū)? ? ??代碼倉庫:NEO的學(xué)習(xí)日記?? ? ??關(guān)注我??帶你學(xué)習(xí)排序知識(shí) ? ???? 我們已經(jīng)學(xué)過的: 插入排序,希爾排序,選擇排序,堆排序 快速排序等等都是 比較排序 也就是需要通過數(shù)據(jù)的比較來進(jìn)行排序 而這里的計(jì)

    2024年02月10日
    瀏覽(26)
  • 詳解八大排序算法-附動(dòng)圖和源碼(插入,希爾,選擇,堆排序,冒泡,快速,歸并,計(jì)數(shù))

    詳解八大排序算法-附動(dòng)圖和源碼(插入,希爾,選擇,堆排序,冒泡,快速,歸并,計(jì)數(shù))

    目錄 ??一.排序的概念及應(yīng)用?? ?1.排序的概念 ?2.排序的應(yīng)用 ?3.常用的排序算法 ??二.排序算法的實(shí)現(xiàn)?? 1.插入排序 1.1直接插入排序 1.2希爾排序(縮小增量排序) 2.選擇排序 2.1直接選擇排序 2.2堆排序 3.比較排序 3.1冒泡排序 3.2快速排序? 遞歸版本 快速排序遞歸優(yōu)化 快速

    2024年02月01日
    瀏覽(16)
  • 插入/希爾/選擇/堆/冒泡/快速/歸并/計(jì)數(shù)排序 && 排序原理 && 搜索樹原理 && 哈希概念

    第?1?題(編程題) 題目名稱: 插入排序和希爾排序 題目?jī)?nèi)容: 第?2?題(編程題) 題目名稱: 選擇排序和堆排序 題目?jī)?nèi)容: 第?3?題(編程題) 題目名稱: 冒泡排序和快速排序 題目?jī)?nèi)容: 第?1?題(單選題) 題目名稱: 2.使用選擇排序?qū)﹂L(zhǎng)度為100的數(shù)組進(jìn)行排序,則

    2024年02月07日
    瀏覽(25)
  • C語言實(shí)現(xiàn)八大排序算法(詳解插入排序、希爾排序、選擇排序、堆排序、冒泡排序、快速排序(遞歸和非遞歸)、歸并排序(遞歸和非遞歸)和計(jì)數(shù)排序)

    C語言實(shí)現(xiàn)八大排序算法(詳解插入排序、希爾排序、選擇排序、堆排序、冒泡排序、快速排序(遞歸和非遞歸)、歸并排序(遞歸和非遞歸)和計(jì)數(shù)排序)

    本篇文章使用C語言實(shí)現(xiàn)了數(shù)據(jù)結(jié)構(gòu)中常見的八大排序算法,它們分別是 插入排序、希爾排序、選擇排序、堆排序、冒泡排序、快速排序、歸并排序和計(jì)數(shù)排序 。在排序算法的實(shí)現(xiàn)過程中,每種算法都有其獨(dú)特的特點(diǎn)和適用場(chǎng)景。插入排序通過逐步構(gòu)建有序序列來排序,希爾

    2024年01月24日
    瀏覽(23)
  • 【數(shù)據(jù)結(jié)構(gòu)】一文帶你全面了解排序(下)——冒泡排序、快速排序、歸并排序、計(jì)數(shù)排序

    【數(shù)據(jù)結(jié)構(gòu)】一文帶你全面了解排序(下)——冒泡排序、快速排序、歸并排序、計(jì)數(shù)排序

    ? 目錄 一、常見排序算法的實(shí)現(xiàn)? ?1.1?交換排序 1.1.1?基本思想 1.1.2?冒泡排序? 1.1.3?快速排序 1.2 歸并排序 1.3 非比較排序 二、排序算法復(fù)雜度及穩(wěn)定性分析 ?人總得為過去的懶惰而付出點(diǎn)代價(jià)! 1.1.1?基本思想 基本思想:所謂交換,就是根據(jù)序列中兩個(gè)記錄鍵值的比較結(jié)

    2024年02月16日
    瀏覽(21)
  • 【快速排序算法思想及其應(yīng)用】

    本文主要介紹Java中快速排序(Quick Sort)算法的基本原理、實(shí)現(xiàn)方式以及使用場(chǎng)景。快速排序是一種高效的排序算法,通過選取一個(gè)基準(zhǔn)元素并將待排序序列劃分為小于基準(zhǔn)元素和大于基準(zhǔn)元素的兩部分來實(shí)現(xiàn)排序。本文將深入剖析快速排序的思想及其在實(shí)際應(yīng)用中的價(jià)值。

    2024年02月07日
    瀏覽(21)
  • 快速排序的基本思想(圖文詳解)

    快速排序的基本思想(圖文詳解)

    快速排序算法通過多次比較和交換來實(shí)現(xiàn)排序,其排序流程如下: (1)首先設(shè)定一個(gè)分界值,通過該分界值將數(shù)組分成左右兩部分。 (2)將大于或等于分界值的數(shù)據(jù)集中到數(shù)組右邊,小于分界值的數(shù)據(jù)集中到數(shù)組的左邊。此時(shí),左邊部分中各元素都小于分界值,而右邊部分中各

    2024年02月01日
    瀏覽(18)
  • 【算法】排序——?dú)w并排序和計(jì)數(shù)排序

    【算法】排序——?dú)w并排序和計(jì)數(shù)排序

    ?========================================================================= 主頁點(diǎn)擊直達(dá):個(gè)人主頁 我的小倉庫:代碼倉庫 C語言偷著笑:C語言專欄 數(shù)據(jù)結(jié)構(gòu)挨打小記: 初階數(shù)據(jù)結(jié)構(gòu)專欄 Linux被操作記: Linux專欄 LeetCode刷題掉發(fā)記: LeetCode刷題 算法頭疼記: 算法專欄? ========================

    2024年02月08日
    瀏覽(26)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包