【數據結構入門】排序算法(5):計數排序

目錄

1. 比較排序和非比較排序

2. 計數排序的原理

2.1 計數排序的弊端

3.代碼復現

3.1 代碼分析

3.2 排序核心

3.3 時間、空間復雜度


1. 比較排序和非比較排序

? ? ? ? 比較排序是根據排序元素的具體數值比較來進行排序;非比較排序則相反,非比較排序例如:基數排序和計數排序,這兩種排序方式雖然諧音類似,但是其實是完全不同的兩種排序。

????????首先基數排序是根據一個數字的某一位進行排序;而計數排序是根據某一個數字出現的次數來進行比較排序。

2. 計數排序的原理

①需要判斷出整個原數組中最大的數字,例如是5,那么就需要創建一個0-5的數組(元素為6個)。

新創建的數組的下標表示該數字的值該數組的下標所對應的值就類似于該數字出現了幾次

③遍歷原始數組,如果遍歷到某一個數字,那么新數組的對應位置的值就會+1;

④遍歷完畢之后,對統計次數的數組進行排序即可;

排序的過程也非常巧妙,首先0下標的值是2,說明0出現了2次,1下標的值是0,說明沒有1,2下標的值是2說明有兩個2......我們直接對原數組進行覆蓋即可。

2.1 計數排序的弊端

????????例如需要將下面幾個數進行計數排序,按照上面的原理,我們需要開辟一個0-5000(5001個數組元素)的數組,但是需要排序的數只有僅僅5個,這樣一來,大量的數組空間會被浪費。

? ? ? ? 從下圖得知,最小的數是1000,也就是說0-1000這1000個數就沒有必要為其準備空間了,所以只需要準備4000個空間就夠了。

????????此時數的存儲是一個相對位置,例如1000存在數組下標為0的位置上,1005存在數組下標為5的位置上,1100存儲在數組下標為100的位置上......5000存在數組下標為4000,計算方式a[i] - min,當前位置-最小值。

? ? ? ? 所以說,比較稀疏的數進行排序的話,那么就會浪費大量連續空間。

3.代碼復現

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>// 計數排序
void count_sort(int* arr, int size)
{// 選出最大值和最小值int max = arr[0];int min = arr[0];for (int i = 0; i < size; i++){if (arr[i] > max){max = arr[i];}if (arr[i] < min){min = arr[i];}}// 創建一個具體數量的數組int range = max - min + 1;// 0-9一共10個數int* countArr = (int*)malloc(sizeof(int) * range);memset(countArr, 0, range * sizeof(int));// 遍歷原數組給countArr賦值,計數for (int i = 0; i < size; i++)// countArr下標是arr的值;其值是次數{int val = arr[i] - min; // 這里是相對位置,若只有0-4000個位置,1005就是5號位置,// 這里要arr[i] - min得到相對位置++countArr[val];}int index = 0;// 原數組的覆蓋下標// 遍歷countArr將原數組覆蓋for (int j = 0; j < range; j++){// 計數數組的值是幾就覆蓋幾次while (countArr[j]--){arr[index++] = j + min; // 將下標進行還原,之前是-min存入countArr的 }}free(countArr);
}int main()
{int a[] = { 3,5,4,1,7,9,8,5,0,5 };int size = sizeof(a) / sizeof(int);count_sort(a, size);for (int i = 0; i < size; i++){printf("%d ", a[i]);}return 0;
}

3.1 代碼分析

①首先計算出原數組的最大最小值,最大值-最小值+1就是計數數組的長度。

②遍歷原數組,原數組的值對應計數數組的下標,如果遍歷到2,那么就是計數數組下標為2的值進行+1;

③遍歷計數數組,將對應下標作為原數組的值,計數數組的值就是需要賦值的次數,例如上圖的5,在計數數組中存儲的方式是index = 5,val = 3,那么就是將5賦值原數組,賦值3次,結果如下圖。

3.2 排序核心

? ? ? ? 就是利用數組的下標將無序的數字分別放入對應的下標,從而實現有序,這里對于重復數字進行一個累加的過程,反作用于原數組就是賦值的次數,這樣的排序類似于下圖:

? ? ? ? 利用連續的有序數組下標作為“柱子”,如果該數字為這個柱子的編號,那么這個柱子就套一個圈,每一個柱子套圈的個數其實就是該數字出現的次數,由于柱子的編號是連續且有序,其實在套圈的過程中,我們已經將數字排好序了,此時只需要將結果覆蓋原數組即可。

? ? ? ? 所以這個算法可以運用于,數據非常集中,有大量重復出現的數字的數組中。

3.3 時間、空間復雜度

? ? ? ? 我們注意這里的時間復雜度,看代碼我們可以發現遍歷了一次原數組,這里時間復雜度是O(n),后面需要遍歷計數數組,那么時間復雜度是O(range),那么最后的時間復雜度就是:

O(n + range)

空間復雜度,這里只需要一個range大的數組,所以這里是:

O(range)

(不是橘子哈)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/97021.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/97021.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/97021.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

輸入3.8V~32V 輸出2A 的DCDC降壓芯片SCT9320

同志們&#xff0c;今天來個降壓芯片SCT9320。輸入3.8V~32V&#xff0c;輸出最高可以達到2A。0.8V的參考電壓。500k的開關頻率。一共八個引腳&#xff0c;兩個NC&#xff08;為什么不做成六個引腳呢&#xff1f;&#xff09;。EN引腳懸空或者接到VIN都可以直接啟動&#xff0c;…

C++類和對象詳解(2);初識類的默認成員函數

1.類的默認成員函數默認成員函數就是用戶沒有顯示實現&#xff0c;編譯器會自動生成的成員函數稱為默認成員函數。一個類我們不寫的情況下編譯器會默認生成以下的6個默認成員函數。&#xff08;1&#xff09;構造函數&#xff1a;主要完成初始化的工作&#xff08;2&#xff09…

PLC通信 Tpc客戶端Socket

1.PLC通信 namespace _2.PLC通信 {public partial class Form1 : Form{public Form1(){InitializeComponent();}//連接//1.型號: 跟PLC溝通 使用哪個型號的PLC//2.IP 同上//3.機臺號:同上//4.插槽號:同上Plc plc new Plc(CpuType.S71200, "192.168.25.80", 0, 1);pr…

Android 開發實戰:從零到一集成 espeak-ng 實現中文離線 TTS(無需賬號開箱即用)

簡介 在移動應用開發中,語音合成(TTS)技術是提升用戶體驗的重要工具。然而,許多開發者在集成 TTS 時面臨依賴網絡、需注冊賬號、功能受限等問題。本文將帶你從零開始,通過開源項目 espeak-ng,實現無需賬號、開箱即用的中文離線語音播報。 文章將覆蓋以下核心內容: esp…

直播APP集成美顏SDK詳解:智能美妝功能的開發實戰

在這個“顏值即正義”的時代&#xff0c;用戶對直播APP的第一印象&#xff0c;往往來自主播的畫面質量。高清的視頻固然重要&#xff0c;但如果缺少自然美顏和智能美妝功能&#xff0c;觀眾體驗就會大打折扣。于是&#xff0c;美顏SDK成了直播行業的“標配”。今天&#xff0c;…

C++內存管理:new與delete的深層解析

1. 引言在C的世界里&#xff0c;動態內存管理是一個核心話題。對于從C語言過渡到C的開發者來說&#xff0c;一個常見的困惑是&#xff1a;既然C語言的malloc和free依然可以在C中使用&#xff0c;為什么C還要引入new和delete這兩個操作符&#xff1f;本文將深入探討這兩對內存管…

【AI開發】【前后端全棧】[特殊字符] AI 時代的快速開發思維

&#x1f680; AI 時代的快速開發思維 —— 以 Django Vue3 為例的前后端分離快捷開發流程 一、AI 時代的開發新思路 在 AI 的加持下&#xff0c;軟件開發不再是“純體力活”&#xff0c;而是 思維工具自動化 的協作。 過去&#xff1a;需求 → 設計 → 開發 → 測試 → 上…

Day24_【深度學習(3)—PyTorch使用—張量的創建和類型轉換】

一、創建張量1.張量基本創建方式torch.tensor 根據指定數據創建張量 &#xff08;最重要&#xff09;torch.Tensor 根據形狀創建張量, 其也可用來創建指定數據的張量torch.IntTensor、torch.FloatTensor、torch.DoubleTensor 創建指定類型的張量1.1 torch.tensor# 方式一&…

3-12〔OSCP ? 研記〕? WEB應用攻擊?利用XSS提權

鄭重聲明&#xff1a; 本文所有安全知識與技術&#xff0c;僅用于探討、研究及學習&#xff0c;嚴禁用于違反國家法律法規的非法活動。對于因不當使用相關內容造成的任何損失或法律責任&#xff0c;本人不承擔任何責任。 如需轉載&#xff0c;請注明出處且不得用于商業盈利。 …

AI 大模型賦能智慧礦山:從政策到落地的全棧解決方案

礦山行業作為能源與工業原料的核心供給端&#xff0c;長期面臨 “安全生產壓力大、人工效率低、技術落地難” 等痛點。隨著 AI 大模型與工業互聯網技術的深度融合&#xff0c;智慧礦山已從 “政策引導” 邁入 “規模化落地” 階段。本文基于 AI 大模型智慧礦山行業解決方案&…

Node.js 項目依賴包管理

h5打開以查看 一、核心理念&#xff1a;從“能用就行”到“精細化管理” 一個規范的依賴管理體系的目標是&#xff1a; 可復現&#xff1a;在任何機器、任何時間都能安裝完全一致的依賴&#xff0c;保證構建結果一致。 清晰可控&#xff1a;明確知道每個依賴為何存在&#x…

洛谷P1835素數密度 詳解

題目如下&#xff1a;這里面有部分代碼比較有意思&#xff1a;1&#xff0c;為何開始先遍歷&#xff0c;最終值小于50000&#xff1f;因為題目要求的右邊與左邊差小于 10^6 &#xff0c;所以最多有10^3個素數&#xff0c;所以保存里面的素數數量大于1000&#xff0c;而50000的化…

突破限制:FileCodeBox遠程文件分享新體驗

文章目錄【視頻教程】1.Docker部署2.簡單使用演示3. 安裝cpolar內網穿透4. 配置公網地址5. 配置固定公網地址在隱私日益重要的今天&#xff0c;FileCodeBox與cpolar的協同為文件傳輸提供了安全高效的解決方案。通過消除公網IP限制和隱私顧慮&#xff0c;讓每個人都能掌控自己的…

以太網鏈路聚合實驗

一、實驗目的掌握使用手動模式配置鏈路聚合的方法掌握使用靜態 LACP 模式配置鏈路聚合的方法掌握控制靜態 LACP 模式下活動鏈路的方法掌握靜態 LACP 的部分特性的配置二、實驗環境安裝有eNSP模擬器的PC一臺&#xff0c;要求PC能聯網。三、實驗拓撲LSW1與LSW2均為S3700交換機。L…

autMan安裝教程

一、安裝命令 如果你系統沒安裝docker&#xff0c;請看往期教程 以下為通用命令 docker run -d --name autman --restart always -p 8080:8080 -p 8081:8081 -v /root/autman:/autMan --log-opt max-size10m --log-opt max-file3 hdbjlizhe/autman:latest解釋一下以上命令&…

【無人機】自檢arming參數調整選項

檢查項目 (英文名)中文含義檢查內容四旋翼建議 (新手 → 老手)理由說明All所有檢查啟用下面所有的檢查項目。? 強烈建議勾選這是最安全的設置&#xff0c;確保所有關鍵系統正常。Barometer氣壓計檢查氣壓計是否健康、數據是否穩定。? 必須勾選用于定高模式&#xff0c;數據異…

數字圖像處理(1)OpenCV C++ Opencv Python顯示圖像和視頻

Open CV C顯示圖像#include <iostream> #include <opencv2/opencv.hpp> using namespace cv;//包含cv命名空間 int main() {//imread(path)&#xff1a;從給定路徑讀取一張圖片&#xff0c;儲存為Mat變量對象Mat img imread("images/love.jpg");//named…

【芯片設計-信號完整性 SI 學習 1.2.2 -- 時序裕量(Margin)】

文章目錄1. 什么是時序裕量&#xff08;Margin&#xff09;1. 背景&#xff1a;為什么需要數字接口時序分析2. 時鐘周期方程3. Setup 裕量 (tMARGIN_SETUP)4. Hold 裕量 (tMARGIN_HOLD)5. 設計注意事項6. 實際應用場景2. 時序裕量的來源3. 測試方法(1) 眼圖測試 (Eye Diagram)(…

AOP 切面日志詳細

在業務方法上打注解package com.lib.service;Service public class BookService {LogExecution(description "查詢圖書")public Book query(int id) {return repo.findById(id);}LogExecution(description "借閱圖書")public void borrow(int id) {// 模…

使用paddlepaddle-Gpu庫時的一個小bug!

起初安裝的是 paddlepaddle 2.6.1版本。 用的是Taskflow的快速分詞以及ner快速識別&#xff1a;???????seg_accurate Taskflow("word_segmentation", mode"fast") ner Taskflow("ner", mode"fast")但是使用不了Gpu。想使用Gp…