排序算法--基數排序

核心思想是按位排序(低位到高位)。適用于定長的整數或字符串,如例如:手機號、身份證號排序。按數據的每一位從低位到高位(或相反)依次排序,每次排序使用穩定的算法(如計數排序)。

#include <stdlib.h>
// 獲取數組中最大值(用于確定位數)
int getMax(int arr[], int n) {int max = arr[0];for (int i = 1; i < n; i++) {if (arr[i] > max) {max = arr[i];}}return max;
}// 使用計數排序對指定位數進行排序(exp=1,10,100...)
void countSort(int arr[], int n, int exp) {int* output = (int*)malloc(n * sizeof(int));  // 輸出數組int count[10] = {0};                          // 十進制計數數組// 統計當前位數字出現次數for (int i = 0; i < n; i++) {count[(arr[i] / exp) % 10]++;}// 計算累計位置(穩定排序關鍵)for (int i = 1; i < 10; i++) {count[i] += count[i - 1];}// 反向填充保證穩定性(相同數字保持原順序)for (int i = n - 1; i >= 0; i--) {output[count[(arr[i] / exp) % 10] - 1] = arr[i];count[(arr[i] / exp) % 10]--;}// 將排序結果復制回原數組for (int i = 0; i < n; i++) {arr[i] = output[i];}free(output);
}// 基數排序主函數(LSD:最低位優先)
void radixSort(int arr[], int n) {int max = getMax(arr, n);// 按每一位進行計數排序for (int exp = 1; max / exp > 0; exp *= 10) {countSort(arr, n, exp);}
}
#include <stdio.h>
// 打印數組
void printArray(int arr[], int n) {for (int i = 0; i < n; i++) {printf("%d ", arr[i]);}printf("\n");
}int main() {int arr[] = {170, 45, 75, 90, 802, 24, 2, 66}; // 測試數據int n = sizeof(arr) / sizeof(arr[0]);printf("排序前: ");printArray(arr, n);radixSort(arr, n);printf("排序后: ");printArray(arr, n);return 0;
}

優化建議:

1.基數選擇優化,使用更大的基數(如256),減少迭代次數,提升緩存利用率

2.內存預分配,預分配輸出數組空間,減少多次內存分配開銷

3負數處理,分離符號位單獨處理,支持負數排序

擴展優化示例(支持負數)

void radixSortWithNegative(int arr[], int n) {// 分離正負數int* positive = malloc(n * sizeof(int));int* negative = malloc(n * sizeof(int));int pos_count = 0, neg_count = 0;for (int i = 0; i < n; i++) {if (arr[i] >= 0) {positive[pos_count++] = arr[i];} else {negative[neg_count++] = -arr[i]; // 取絕對值處理}}// 分別排序正負數radixSort(positive, pos_count);radixSort(negative, neg_count);// 合并結果(負數逆序)int index = 0;for (int i = neg_count - 1; i >= 0; i--) {arr[index++] = -negative[i];}for (int i = 0; i < pos_count; i++) {arr[index++] = positive[i];}free(positive);free(negative);
}

?

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

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

相關文章

數據結構:時間復雜度

文章目錄 為什么需要時間復雜度分析&#xff1f;一、大O表示法&#xff1a;復雜度的語言1.1 什么是大O&#xff1f;1.2 常見復雜度速查表 二、實戰分析&#xff1a;解剖C語言代碼2.1 循環結構的三重境界單層循環&#xff1a;線性時間雙重循環&#xff1a;平方時間動態邊界循環&…

S4 HANA明確稅金匯差科目(OBYY)

本文主要介紹在S4 HANA OP中明確稅金匯差科目(OBYY)相關設置。具體請參照如下內容&#xff1a; 1. 明確稅金匯差科目(OBYY) 以上配置點定義了在外幣掛賬時&#xff0c;當憑證抬頭匯率和稅金行項目匯率不一致時&#xff0c;造成的差異金額進入哪個科目。此類情況只發生在FB60/F…

hypermesh中用tcl腳本生成多個線段

hypermesh中原本有利用多個節點生成線段的功能&#xff0c;但實際應用中不太好用&#xff0c;因為hypermesh會自動對線段進行擬合。如果手動生成多個線段&#xff0c;又太繁瑣&#xff0c;這里寫了一段腳本來自動生成&#xff08;#為注釋符號&#xff09;。 set alist {} for …

87.(3)攻防世界 web simple_php

之前做過&#xff0c;回顧 12&#xff0c;攻防世界simple_php-CSDN博客 進入靶場 <?php // 顯示當前 PHP 文件的源代碼&#xff0c;方便調試或查看代碼結構 // __FILE__ 是 PHP 的一個魔術常量&#xff0c;代表當前文件的完整路徑和文件名 show_source(__FILE__);// 包含…

pycharm 中的 Mark Directory As 的作用是什么?

文章目錄 Mark Directory As 的作用PYTHONPATH 是什么PYTHONPATH 作用注意事項 Mark Directory As 的作用 可以查看官網&#xff1a;https://www.jetbrains.com/help/pycharm/project-structure-dialog.html#-9p9rve_3 我們這里以 Mark Directory As Sources 為例進行介紹。 這…

一個類有一個全局變量 m,多線程對它進行增加操作,如何保證線程安全?

一個類有一個全局變量 m&#xff0c;多線程對它進行增加操作&#xff0c;如何保證線程安全&#xff1f; 在多線程環境下對共享變量進行修改時&#xff0c;確保線程安全的關鍵是保證操作的原子性、可見性和有序性。以下是針對全局變量 m 的多線程自增操作的線程安全解決方案&am…

CSS關系選擇器詳解

CSS關系選擇器詳解 學習前提什么是關系選擇器&#xff1f;后代選擇器&#xff08;Descendant Combinator&#xff09;語法示例注意事項 子代選擇器&#xff08;Child Combinator&#xff09;語法示例注意事項 鄰接兄弟選擇器&#xff08;Adjacent Sibling Combinator&#xff0…

【基于SprintBoot+Mybatis+Mysql】電腦商城項目之用戶注冊

&#x1f9f8;安清h&#xff1a;個人主頁 &#x1f3a5;個人專欄&#xff1a;【計算機網絡】【Mybatis篇】 &#x1f6a6;作者簡介&#xff1a;一個有趣愛睡覺的intp&#xff0c;期待和更多人分享自己所學知識的真誠大學生。 目錄 &#x1f3af;項目基本介紹 &#x1f6a6;項…

Microsoft Power BI:融合 AI 的文本分析

Microsoft Power BI 是微軟推出的一款功能強大的商業智能工具&#xff0c;旨在幫助用戶從各種數據源中提取、分析和可視化數據&#xff0c;以支持業務決策和洞察。以下是關于 Power BI 的深度介紹&#xff1a; 1. 核心功能與特點 Power BI 提供了全面的數據分析和可視化功能&…

電控三周速成計劃參考

第1周&#xff1a;基礎搭建與GPIO控制 學習目標&#xff1a;建立開發環境&#xff0c;掌握最基礎的硬件控制能力 每日學習&#xff08;2-3小時&#xff09;&#xff1a; 環境搭建&#xff08;2天&#xff09; 安裝Keil MDK-ARM STM32CubeMX使用CubeMX創建第一個工程&#xf…

[SAP ABAP] 在ABAP Debugger調試器中設置斷點

在命令框輸入/H&#xff0c;點擊回車以后&#xff0c;調試被激活&#xff0c;點擊觸發任意事件進入ABAP Debugger調試器界面 點擊按鈕&#xff0c;可以在Debugger調試器中新增臨時斷點 我們可以從ABAP命令、方法、功能、表單、異常、消息、源代碼等多個維度在Debugger調試器中設…

【NEXT】網絡編程——上傳文件(不限于jpg/png/pdf/txt/doc等),或請求參數值是file類型時,調用在線服務接口

最近在使用華為AI平臺ModelArts訓練自己的圖像識別模型&#xff0c;并部署了在線服務接口。供給客戶端&#xff08;如&#xff1a;鴻蒙APP/元服務&#xff09;調用。 import核心能力&#xff1a; import { http } from kit.NetworkKit; import { fileIo } from kit.CoreFileK…

RssWebAll:抓取任意網頁的內容生成 RSS 訂閱源

RssWebAll&#xff1a;抓取任意網頁的內容生成 RSS 訂閱源 RssWebAll 是一個強大的工具&#xff0c;可以幫助用戶抓取任意網頁的內容&#xff0c;并生成相應的 RSS 訂閱源&#xff0c;讓用戶隨時隨地獲取他們感興趣的內容更新。 功能亮點 簡單易用&#xff1a;所見即所得&…

從一到無窮大 #43:Presto History Based Optimizer,基于PlanNode粒度統計的查詢計劃選擇策略

本作品采用知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協議進行許可。 本作品 (李兆龍 博文, 由 李兆龍 創作)&#xff0c;由 李兆龍 確認&#xff0c;轉載請注明版權。 文章目錄 引言MotivationArchitectureHBO ScenarioExperiments結束語 引言 過年回家這件事在摯…

【C++】繼承(下)

大家好&#xff0c;我是蘇貝&#xff0c;本篇博客帶大家了解C的繼承&#xff08;下&#xff09;&#xff0c;如果你覺得我寫的還不錯的話&#xff0c;可以給我一個贊&#x1f44d;嗎&#xff0c;感謝?? 目錄 5.繼承與友元6.繼承與靜態成員7.復雜的菱形繼承及菱形虛擬繼承8.繼…

項目開發實踐——基于SpringBoot+Vue3實現的在線考試系統(九)(完結篇)

文章目錄 一、成績查詢模塊實現1、學生成績查詢功能實現1.1 頁面設計1.2 前端頁面實現1.3 后端功能實現2、成績分段查詢功能實現2.1 頁面設計2.2 前端頁面實現2.3 后端功能實現二、試卷練習模塊實現三、我的分數模塊實現1、 頁面設計2、 前端頁面實現3、 后端功能實現四、交流區…

【流媒體】搭建流媒體服務器

搭建Windows Nginx服務器 搭建 下載nginx工具包解壓至本地&#xff0c;并在cmd窗口中切換至nginx所在的本地目錄修改 conf/nginx.conf 文件&#xff0c;更改其端口號 server中的 listen的端口號從 80改為 8080&#xff0c;因為80經常被其他服務占用&#xff0c;導致無法打開 …

攜程Java開發面試題及參考答案 (200道-下)

insert 一行數據的時候加的是什么鎖?為什么? 在 MySQL 中,當執行 INSERT 操作插入一行數據時,加鎖的情況會因存儲引擎和具體的事務隔離級別而有所不同。一般來說,在 InnoDB 存儲引擎下,INSERT 操作加的是行級排他鎖(Row Exclusive Lock),以下詳細說明原因。 行級排他…

洛谷P11655「FAOI-R5」Lovely 139

P11655「FAOI-R5」Lovely 139 題目背景 Update&#xff1a;數據有 0 0&#xff0c;答案為 1&#xff0c;請選手特判以正常通過。 Height ≤ 139 \text{Height}\leq139 Height≤139。 題目描述 對于一個 01 \tt 01 01 串 S S S&#xff08;下標從 1 1 1 開始&#xff09;…

【Linux】24.進程信號(1)

文章目錄 1. 信號入門1.1 進程與信號的相關知識1.2 技術應用角度的信號1.3 注意1.4 信號概念1.5 信號處理常見方式概覽 2. 產生信號2.1 通過終端按鍵產生信號2.2 調用系統函數向進程發信號2.3 由軟件條件產生信號2.4 硬件異常產生信號2.5 信號保存 3. 阻塞信號3.1 信號其他相關…