基礎排序演算法(附加java實現)

来源:https://www.cnblogs.com/AICROC/archive/2020/06/02/13027968.html
-Advertisement-
Play Games

七種最基本的排序演算法:(面試必會!) 冒泡排序: 最基礎的排序演算法,從數列最前端開始,兩兩比較,如果前一個數比後一個數大,那麼兩個數就交換位置,經過一輪遍歷之後,最大的數就到了數列的最後一個位置上,再進行下一次迴圈,第二大的數就浮到了倒數第二個位置,這樣一步步較大的數往上浮的過程就是冒泡排序。 ja ...


七種最基本的排序演算法:(面試必會!)

 

冒泡排序: 

  最基礎的排序演算法,從數列最前端開始,兩兩比較,如果前一個數比後一個數大,那麼兩個數就交換位置,經過一輪遍歷之後,最大的數就到了數列的最後一個位置上,再進行下一次迴圈,第二大的數就浮到了倒數第二個位置,這樣一步步較大的數往上浮的過程就是冒泡排序。

java實現:

 1 public void bubbleSort(int[] arr) {
 2     for (int i = 0;  i < arr.length;  i++) {
 3       for (int j = 0; j < arr.length - 1; j++) {
 4           if(arr[j] > arr[j+1]) {
 5               arr[j] = arr[j]^arr[j+1];     //通過一個數異或同一個數兩次,結果不變
 6               arr[j+1] = arr[j]^arr[j+1];  //的方法將兩個數的值進行交換
 7               arr[j] = arr[j]^arr[j+1];
 8                }
 9       }
10     }
11 }

時間複雜度 O(n^2),空間複雜度O(1),穩定性(a=b,排序前a在b的前面,排序後仍在前即為穩定):穩定 

 

選擇排序:

  將一個數列看成有序區和無序區,剛開始,有序區沒有元素,無序區就是整個列表。將無序區的最大(或者最小)的元素找到,並與無序區的第一個元素交換位置,那麼這時,無序區的第一個元素就是最大(或者最小的),此時無序區就變為第一個元素之後的剩餘元素,再對剩餘元素進行找最大(或者最小)元素的操作,並再把該元素與此時無序區第一個元素位置互換,依次類推,那麼整個數列中最大(或者最小)的元素就依次排在了數列中

Java實現:(註意:選擇排序在實現時,是記錄最大值的索引,如果出現更大的值,就更新索引,最後通過索引互換元素)

 1     public void selectSort(int[] arr) {
 2         int subMin;
 3         for (int i = 0; i < arr.length - 1; i++) {
 4             subMin = i;
 5             for (int j = i + 1 ; j < arr.length; j++) {
 6                 if(arr[j] < arr[subMin]) {
 7                     subMin = j;
 8                 }
 9             }        
10             if (i != subMin) {     //一定要加這個判斷,不然當i=subMin的時候,兩個相同的數異或為零
11                 arr[i] = arr[i]^arr[subMin];
12                 arr[subMin] = arr[i]^arr[subMin];
13                 arr[i] = arr[i]^arr[subMin];
14             }
15         }    
16     }

時間複雜度 O(n^2),空間複雜度O(1),穩定性:不穩定 

 

插入排序:

  插入排序也比較直觀,通過構建有序序列,對於未排序數據,在已排序序列中從後向前掃描,找到相應位置並插入。

 1     public void insertSort(int[] arr) {
 2         
 3         //從下標為1的元素開始選擇合適的位置插入,因為下標為0只有一個元素,預設是有序的
 4         for (int i = 1; i < arr.length; i++) {
 5             
 6             //tmp為要插入的元素
 7             int tmp = arr[i];
 8             
 9             //j表示已排序部分的索引,它將逐漸自減
10             int j = i;
11             
12             //挪位置
13             while (j>0 && tmp<arr[j-1]) {
14                 arr[j] = arr[j-1];
15                 j--;    
16             }
17             
18             //插入
19             if(j!=i) {
20                 arr[j] = tmp;        
21             }
22         }
23     }

插入排序在實現上,需要反覆把已排序元素逐步向後挪位,為最新元素提供插入空間。

時間複雜度 O(n^2),空間複雜度O(1),穩定性:穩定 

 

希爾排序:

  插入排序的改進版,確定一個間隔,然後根據這個間隔進行分組,這個間隔通常為總長度的一半,奇偶數均可。先進行組內排序,組內排序用插入排序的方法。當每組排完序以後,間隔數減半,重新進行分組併進行插入排序,知道間隔數為1,那麼此時對整個數組進行插入排序。

  那麼為什麼使用希爾排序呢?那是因為,當數列元素數目多大的時候, 插入排序的比較次數會遠遠大於希爾排序。

Java實現

 1     public void shellSort(int[] arr) {
 2         
 3         int gap = 1;
 4         
 5         while (gap<arr.length) {
 6             gap = gap * 3 + 1;
 7         }
 8         
 9         while(gap>0) {
10             for (int i = gap; i < arr.length; i++) {
11                 int tmp = arr[i];
12                 int j = i-gap;
13                 while (j>=0 && arr[j]>tmp) {
14                     arr[j+gap] = arr[j];
15                     j = j-gap;
16                 }
17                 arr[j+gap] = tmp;
18             }
19             gap = (int) Math.floor(gap/3);
20         }
21     }

時間複雜度 O(n^1.3),空間複雜度O(1),穩定性:不穩定 

推薦B站視頻:https://www.bilibili.com/video/BV1rE411g7rW [演算法]六分鐘徹底弄懂希爾排序,簡單易懂  by新原家龍之介

 

歸併排序:

  核心思想為分治法,並通過遞歸實現。將長度為n的序列分成兩個長度為n/2的子序列,對這兩個子序列分別採用歸併排序,最後將兩個排序好的子序列合併成一個最終的排序序列。

Java代碼待更新

...

時間複雜度 O(nlog以2為底n的對數),空間複雜度O(n),穩定性:穩定 

 

快速排序:

  快速排序也是分治法加遞歸的思想,首先從數列中挑出一個元素作為基準(pivot);重新排列數列,所有比基準小的元素放在基準前面,所有比基準大的擺在後面,(相同的數可以到仍一邊)。在這個分區退出以後,該基準就處在數列的中間位置。遞歸地把小於基準值元素的子數列和大於基準值元素的子數列排列。

Java代碼待更新

....

時間複雜度 O(nlog以2為底n的對數),空間複雜度O(nlog以2為底n的對數),穩定性:不穩定 

 

堆排序:

  堆排序(Heapsort)是指利用堆這種數據結構所設計的一種排序演算法。堆積是一個近似完全二叉樹的結構,並同時滿足堆積的性質:即子結點的鍵值或索引總是小於(或者大於)它的父節點。堆排序可以說是一種利用堆的概念來排序的選擇排序。分為兩種方法:

  1. 大頂堆:每個節點的值都大於或等於其子節點的值,在堆排序演算法中用於升序排列;
  2. 小頂堆:每個節點的值都小於或等於其子節點的值,在堆排序演算法中用於降序排列;

Java代碼實現待更新:
...

時間複雜度 O(nlog以2為底n的對數),空間複雜度O(1),穩定性:不穩定 

可參考B站視頻:https://www.bilibili.com/video/BV1Gb411a7o3?from=search&seid=13649039337940123139


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 類規範:包括類聲明以及類方法定義 類聲明提供類的藍圖 方法定義提供細節 常見不通用的約定:類名首字母大寫 類介面: 介面由編寫類的人提供的方法組成。介面讓程式員能夠編寫與類對象交互的代碼,從而讓程式能夠使用類對象。 要使用某個類,必須瞭解其公共介面;要編寫類,必須創建其公共介面。 通常,C++程式員 ...
  • @(目錄) 我的經歷 關註我的朋友都知道,關註兩個字劃重點,要考! 我最近一直在寫Spring的文章,而且僅僅是Spring FrameWork的文章 ,從最開始的官網入門到現在源碼的深度分析。主要就是三個系列 官網入門系列,Spring官網讀書筆記,這一系列的文章是入門Spring的不二之選,也是 ...
  • 最近在學習數據結構,特此記錄一下,方便以後查閱. 1 //定義一個類來管理我們的英雄 也就是鏈表 2 class SingleLinkedList{ 3 //先初始化一個頭節點,頭節點不能動,用於尋找鏈表的頭 4 private HeroNode head = new HeroNode(0,""," ...
  • 1. 用於語句覆蓋的基路徑法 基路徑法保證設計出的測試用例,使程式的每一個可執行語句至少執行一次,即實現語句覆蓋。基路徑法是理論與應用脫節的典型,基本上沒有應用價值,讀者稍作瞭解即可,不必理解和掌握。 基路徑法步驟如下: 1)畫出程式的控制流圖 控制流圖是描述程式控制流的一種圖示方法,主要由結點和邊 ...
  • 本文源碼:GitHub·點這裡 || GitEE·點這裡 一、數據可視化 1、基礎概念 數據可視化,是關於數據視覺表現形式的科學技術研究。其中,這種數據的視覺表現形式被定義為,一種以某種概要形式抽取出來的信息,包括相應信息單位的各種屬性和變數。 如果說的實際貼切的話:系統開發中常見的數據報表統計,將 ...
  • 老孟導讀:CustomPaint可以稱之為動畫鼻祖,它可以實現任何酷炫的動畫和效果。CustomPaint本身沒有動畫屬性,僅僅是繪製屬性,一般情況下,CustomPaint會和動畫控制配合使用,達到理想的效果。 基本用法 CustomPaint的用法非常簡單,如下: CustomPaint( pa ...
  • HashMap是我們在編程中最常用的map,也是面試中經常考的問題,所以打算深入研究一下hashmap的源碼,並且對比7和8中的不同。一、hashmap的數據結構 hashmap的數據結構是哈希表,核心是基於哈希值的桶,而哈希桶的底層實現其實是數組,數組這種數據結構查找的時間複雜度是O(1),所以哈 ...
  • 前言 本文的文字及圖片來源於網路,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯繫我們以作處理。 歡迎點擊右上角關註小編,除了分享技術文章之外還有很多福利,私信學習資料可以領取包括不限於Python實戰演練、PDF電子文檔、面試集錦、學習資料等。 小編閑暇時喜歡看熱點,會 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...