【排序算法】典型排序算法 Java實現

以下是典型的排序算法分類及對應的 Java 實現,包含時間復雜度、穩定性說明和核心代碼示例:


一、比較類排序(通過元素比較)

1. 交換排序

① 冒泡排序
時間復雜度:O(n2)(優化后最優O(n))
穩定性:穩定

public static void bubbleSort(int[] arr) {boolean swapped;for (int i = 0; i < arr.length - 1; i++) {swapped = false;for (int j = 0; j < arr.length - i - 1; j++) {if (arr[j] > arr[j + 1]) {int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;swapped = true;}}if (!swapped) break; // 提前終止優化}
}

② 快速排序
時間復雜度:平均 O(n log n),最差 O(n2)
穩定性:不穩定

public static void quickSort(int[] arr, int low, int high) {if (low < high) {int pivot = partition(arr, low, high);quickSort(arr, low, pivot - 1);quickSort(arr, pivot + 1, high);}
}private static int partition(int[] arr, int low, int high) {int pivot = arr[high]; // 選擇末尾為基準int i = low - 1;for (int j = low; j < high; j++) {if (arr[j] < pivot) {i++;int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}}int temp = arr[i + 1];arr[i + 1] = arr[high];arr[high] = temp;return i + 1;
}

2. 插入排序

① 直接插入排序
時間復雜度:O(n2)(最優O(n))
穩定性:穩定

public static void insertionSort(int[] arr) {for (int i = 1; i < arr.length; i++) {int key = arr[i];int j = i - 1;while (j >= 0 && arr[j] > key) {arr[j + 1] = arr[j];j--;}arr[j + 1] = key;}
}

3. 選擇排序

① 簡單選擇排序
時間復雜度:O(n2)
穩定性:不穩定

public static void selectionSort(int[] arr) {for (int i = 0; i < arr.length - 1; i++) {int minIdx = i;for (int j = i + 1; j < arr.length; j++) {if (arr[j] < arr[minIdx]) {minIdx = j;}}int temp = arr[minIdx];arr[minIdx] = arr[i];arr[i] = temp;}
}

4. 歸并排序

時間復雜度:O(n log n)
穩定性:穩定

public static void mergeSort(int[] arr, int left, int right) {if (left < right) {int mid = left + (right - left) / 2;mergeSort(arr, left, mid);mergeSort(arr, mid + 1, right);merge(arr, left, mid, right);}
}private static void merge(int[] arr, int left, int mid, int right) {int[] temp = new int[right - left + 1];int i = left, j = mid + 1, k = 0;while (i <= mid && j <= right) {temp[k++] = arr[i] <= arr[j] ? arr[i++] : arr[j++];}while (i <= mid) temp[k++] = arr[i++];while (j <= right) temp[k++] = arr[j++];System.arraycopy(temp, 0, arr, left, temp.length);
}

5. 堆排序

時間復雜度:O(n log n)
穩定性:不穩定

public static void heapSort(int[] arr) {// 構建最大堆for (int i = arr.length / 2 - 1; i >= 0; i--) {heapify(arr, arr.length, i);}// 逐步提取堆頂元素for (int i = arr.length - 1; i > 0; i--) {int temp = arr[0];arr[0] = arr[i];arr[i] = temp;heapify(arr, i, 0);}
}private static void heapify(int[] arr, int n, int i) {int largest = i;int left = 2 * i + 1;int right = 2 * i + 2;if (left < n && arr[left] > arr[largest]) largest = left;if (right < n && arr[right] > arr[largest]) largest = right;if (largest != i) {int swap = arr[i];arr[i] = arr[largest];arr[largest] = swap;heapify(arr, n, largest);}
}

二、非比較類排序(利用數值特征)

1. 計數排序

時間復雜度:O(n + k)(k 為數據范圍)
穩定性:穩定
適用場景:整數且范圍較小

public static void countingSort(int[] arr) {int max = Arrays.stream(arr).max().getAsInt();int[] count = new int[max + 1];for (int num : arr) count[num]++;int idx = 0;for (int i = 0; i <= max; i++) {while (count[i]-- > 0) {arr[idx++] = i;}}
}

2. 基數排序

時間復雜度:O(nk)(k 為最大位數)
穩定性:穩定

public static void radixSort(int[] arr) {int max = Arrays.stream(arr).max().getAsInt();for (int exp = 1; max / exp > 0; exp *= 10) {countSortByDigit(arr, exp);}
}private static void countSortByDigit(int[] arr, int exp) {int[] output = new int[arr.length];int[] count = new int[10];for (int num : arr) count[(num / exp) % 10]++;for (int i = 1; i < 10; i++) count[i] += count[i - 1];for (int i = arr.length - 1; i >= 0; i--) {output[count[(arr[i] / exp) % 10] - 1] = arr[i];count[(arr[i] / exp) % 10]--;}System.arraycopy(output, 0, arr, 0, arr.length);
}

三、總結與選擇建議

算法平均時間復雜度空間復雜度穩定性適用場景
冒泡排序O(n2)O(1)穩定小數據、教學演示
快速排序O(n log n)O(log n)不穩定通用場景(優化后高效)
歸并排序O(n log n)O(n)穩定大數據、穩定排序需求
堆排序O(n log n)O(1)不穩定原地排序、內存敏感場景
計數排序O(n + k)O(k)穩定整數且數值范圍小
基數排序O(nk)O(n + k)穩定多位數整數(如身份證號)

實際建議

  • 小規模數據:插入排序或冒泡排序(簡單實現)。
  • 通用場景:優先選擇快速排序(需優化基準選擇)。
  • 穩定排序需求:歸并排序或基數排序。
  • 特定數值特征:計數排序/基數排序效率碾壓比較排序。

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

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

相關文章

多模態大語言模型arxiv論文略讀(八十七)

MG-LLaVA: Towards Multi-Granularity Visual Instruction Tuning ?? 論文標題&#xff1a;MG-LLaVA: Towards Multi-Granularity Visual Instruction Tuning ?? 論文作者&#xff1a;Xiangyu Zhao, Xiangtai Li, Haodong Duan, Haian Huang, Yining Li, Kai Chen, Hua Ya…

塔能節能平板燈:點亮蘇州某零售工廠節能之路

在蘇州某零售工廠的運營成本中&#xff0c;照明能耗占據著一定比例。為降低成本、提升能源利用效率&#xff0c;該工廠與塔能科技攜手&#xff0c;引入塔能節能平板燈&#xff0c;開啟了精準節能之旅&#xff0c;并取得了令人矚目的成效。 一、工廠照明能耗困境 蘇州該零售工廠…

數據庫事務的四大特性(ACID)

一、前言 在現代數據庫系統中&#xff0c;事務&#xff08;Transaction&#xff09;是確保數據一致性和完整性的重要機制。事務的四大特性——原子性&#xff08;Atomicity&#xff09;、一致性&#xff08;Consistency&#xff09;、隔離性&#xff08;Isolation&#xff09;…

8 種快速易用的Python Matplotlib數據可視化方法

你是否曾經面對一堆復雜的數據&#xff0c;卻不知道如何讓它們變得直觀易懂&#xff1f;別慌&#xff0c;Python 的 Matplotlib 庫是你數據可視化的最佳伙伴&#xff01;它簡單易用、功能強大&#xff0c;能將枯燥的數字變成引人入勝的圖表。無論是學生、數據分析師還是程序員&…

springboot 控制層調用業務邏輯層,注入報錯,無法自動裝配 解決辦法

報錯&#xff1a; 解決&#xff1a;愿意是業務邏輯層&#xff0c;即service層的具體實現類沒有加注解Service導致的&#xff0c;加上解決了&#xff01;&#xff01;

如何提高獨立服務器的安全性?

獨立服務器相對于其它服務器來說&#xff0c;整體的硬件設備都是獨立的同時還有著強大的服務器性能&#xff0c;其中CPU設備能夠決定著服務器的運算能力&#xff0c;所以獨立服務器的安全性受到企業格外的重視&#xff0c;嚴重的話會給企業造成巨大的資金損失。 那么&#xff0…

關于 Web 風險點原理與利用:6. 邏輯風險點

一、分類&#xff1a; 1.1 越權訪問 **越權訪問&#xff08;Authorization Bypass&#xff09;**是指&#xff1a;攻擊者繞過了權限控制機制&#xff0c;訪問或操作了非其權限范圍內的資源或功能。 換句話說&#xff0c;系統該攔你沒攔&#xff0c;你就越權成功了。 1.1.1 …

分布式緩存:ZSET → MGET 跨槽(cross‐slot)/ 并發 GET解決思路

文章目錄 緩存全景圖Pre問題描述解決思路一、管道&#xff08;Pipelining&#xff09;替代多線程二、使用 Hash Tag 保證數據同槽三、用 Hash 結構一次性批量取值四、把數據直接存進 ZSET&#xff08;或用 RedisJSON&#xff09; 小結 緩存全景圖 Pre 分布式緩存&#xff1a;緩…

開發AR導航助手:ARKit+Unity+Mapbox全流程實戰教程

引言 在增強現實技術飛速發展的今天&#xff0c;AR導航應用正逐步改變人們的出行方式。本文將手把手教你使用UnityARKitMapbox開發跨平臺AR導航助手&#xff0c;實現從虛擬路徑疊加到空間感知的完整技術閉環。通過本教程&#xff0c;你將掌握&#xff1a; AR空間映射與場景理…

助力 FPGA 國產化,ALINX 攜多款方案亮相深圳、廣州“紫光同創 FPGA 技術研討會”

5 月中旬&#xff0c;一年一度的紫光同創技術研討會系列活動正式拉開帷幕&#xff0c;相繼在深圳、廣州帶來 FPGA 技術交流盛宴。 ALINX 作為紫光同創官方合作伙伴&#xff0c;長期助力推動 FPGA 國產化應用發展&#xff0c;此次攜多款基于 Kosmo-2 系列產品開發的方案 demo 亮…

LeetCode 1040.移動石子直到連續II

在 X 軸上有一些不同位置的石子。給定一個整數數組 stones 表示石子的位置。 如果一個石子在最小或最大的位置&#xff0c;稱其為 端點石子。每個回合&#xff0c;你可以將一顆 端點石子 拿起并移動到一個未占用的位置&#xff0c;使得該石子不再是一顆 端點石子。 值得注意的…

梯度優化提示詞:精準引導AI分類

基于梯度優化的提示詞工程方法,通過迭代調整提示詞的嵌入向量,使其能夠更有效地引導模型做出正確分類。 數據形式 訓練數據 train_data 是一個列表,每個元素是一個字典,包含兩個鍵: text: 需要分類的文本描述label: 對應的標簽(“沖動"或"理性”)示例數據: …

JavaWeb:SpringBoot配置優先級詳解

3種配置 打包插件 命令行 優先級 SpringBoot的配置優先級決定了不同配置源之間的覆蓋關系&#xff0c;遵循高優先級配置覆蓋低優先級的原則。以下是詳細的優先級排序及配置方法說明&#xff1a; 一、配置優先級從高到低排序 1.命令行參數 優先級最高&#xff0c;通過keyvalu…

使用CentOS部署本地DeekSeek

一、查看服務器的操作系統版本 cat /etc/centos-release二、下載并安裝ollama 1、ollama下載地址&#xff1a; Releases ollama/ollama GitHubGet up and running with Llama 3.3, DeepSeek-R1, Phi-4, Gemma 3, Mistral Small 3.1 and other large language models. - Re…

Matplotlib 后端與事件循環

前言&#xff1a;很多時候&#xff0c;matplot跑出來的是這種靜態非交互的&#xff0c;如果想要可以交互&#xff0c;就得設定一個后端&#xff0c;例如 matplotlib.use(TkAgg)Matplotlib 后端 (Backend) Matplotlib 的設計理念是能夠以多種方式輸出圖形&#xff0c;無論是顯…

【JAVA】中文我該怎么排序?

&#x1f4d8; Java 中文排序教學文檔&#xff08;基于 Collator&#xff09; &#x1f9e0; 目錄 概述Java 中字符串排序的默認行為為什么需要 Collator使用 Collator 進行中文排序升序 vs 降序排序自定義對象字段排序多字段排序示例總結對比表附錄&#xff1a;完整代碼示例 …

k8s-NetworkPolicy

在 Kubernetes 中&#xff0c;NetworkPolicy 是一種資源對象&#xff0c;用于定義 Pod 之間的網絡通信策略。它允許你控制哪些 Pod 可以相互通信&#xff0c;以及如何通信。通過使用 NetworkPolicy&#xff0c;可以實現更細粒度的網絡訪問控制&#xff0c;增強集群的安全性。 1…

LAN(局域網)和WAN(廣域網)

你的問題非常清晰&#xff01;我來用一個直觀的比喻實際拓撲圖幫你徹底理解LAN&#xff08;局域網&#xff09;和WAN&#xff08;廣域網&#xff09;如何協同工作&#xff0c;以及路由器在其中的位置。你可以把整個網絡想象成一座城市&#xff1a; 1. 比喻&#xff1a;城市交通…

idea 插件開發自動發布到 nexus 私服中(腳本實例)

如下腳本內容為 idea 插件開發項目中的 build.gradle.kts 文件示例&#xff0c;其中自定了 updatePluginsXmlToNexus 和 uploadPluginToNexus 兩個任務&#xff0c;一個用來自動修改 nexus 中的配置文件&#xff0c;一個用來自動將當前插件打包后的 zip 文件上傳到 nexus 私服中…

SpringBoot-11-基于注解和XML方式的SpringBoot應用場景對比

文章目錄 1 基于注解的方式1.1 @Mapper1.2 @select1.3 @insert1.4 @update1.5 @delete2 基于XML的方式2.1 namespace2.2 resultMap2.3 select2.4 insert2.5 update2.6 delete3 service和controller3.1 service3.2 controller4 注解和xml的選擇如果SQL簡單且項目規模較小,推薦使…