排序算法(插入,希爾,選擇,冒泡,堆,快排,歸并)

1.插入排序

插入排序的主要思想是額外申請一個空間cur,讓cur一開始等于數組的第1號位置,設置i=1,讓i-1的元素與其比較,如果arr[i-1]>arr[i],就讓arr[i+1] = arr[i],當進行到最后一次對比結束,i=-1,再讓arr[i+1] = cur。

?
private static void insertsort(int[] arr) {for (int i = 1; i < arr.length; i++) {int cur = arr[i];int j = i-1;for ( ;j>=0; j--) {if(cur>arr[j]){arr[j+1] = arr[j];}else{break;}}arr[j+1] = cur;}}?

排序算法的特點是序列越有序,時間效率越高,下面的希爾排序也體現出來。

時間復雜度:O(n^2)

空間復雜度:O(1)

是一種穩定的排序算法。

2.希爾排序

希爾排序的思想是設置一個常量gap,將數組每個相距gap距離的兩個數進行分組,然后組內進行排序,每進行一次gap排序后,將gap/2,直到gap為1,排序完成。

    private static void shellsort(int[] arr) {int gep = arr.length;while(gep>1){gep/=2;shell(arr,gep);}}private static void shell(int[] arr, int gep) {for(int i = gep;i< arr.length;i++){int cur = arr[i];int j = i-gep;for(;j>=0;j-=gep){if(cur<arr[j]){arr[j+gep] = arr[j];}else{break;}}arr[j+gep] = cur;}}

這里的希爾排序是先拿出gap間距,進行直接插入排序,所以shell方法的實現和插入排序相似。

希爾排序是對插入排序的優化,當gap>1時,都是對序列有序化,直到gap=1時,數組已經趨于有序,就會排序很快,對于整體來說,就有一個優化的效果。

希爾排序的時間復雜度不好計算,因為每次數組長度不確定,gap的取值不確定。

希爾排序的穩定性:不穩定。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

3.選擇排序

選擇排序非常好理解,類似于打擂臺,取出一個元素,將它設置為擂主,依次取后面的元素進行比較,如果小于擂主,就進行交換,如果大于,就繼續遍歷,直到遍歷結束。

private static void selectsort(int [] arr) {for(int i= 0;i< arr.length;i++){for (int j = i+1; j < arr.length; j++) {if(arr[i]>arr[j]){int tem = arr[i];arr[i] = arr[j];arr[j] = tem;}}}}

選擇排序非常好理解,但效率不是特別高,實際很少使用。

時間復雜度:O(n^2)

空間復雜度:O(1)

不穩定。

4.堆排序

堆排序是基于堆這種數據結構實現的,首先要將數組進行建大堆操作,設置bound記錄末尾的位置,然后將數組的頭和bound位置元素交換,此時堆中最大的元素在數組末尾,bound--,此時[0,bound]位置就是待排序位置,在進行向下調整,重復過程。

private static void heapsort(int[] arr) {//建堆creatheap(arr);int bound = arr.length-1;for (int i = 0; i < arr.length; i++) {int tem = arr[0];arr[0] = arr[bound];arr[bound] = tem;bound--;shifsort(arr,0,bound);}}private static void shifsort(int[] arr, int index, int bound) {int parent = index;int child = 2*parent + 1;while(child<bound){if(child+1<bound&&arr[child+1]>arr[child]){child+=1;}if(arr[child]>arr[parent]){int tem = arr[child];arr[child] = arr[parent];arr[parent] = tem;}else{break;}parent = child;child = 2*parent + 1;}}private static void creatheap(int[] arr) {for(int i = (arr.length-1-1)/2;i>=0;i--){shifsort(arr,i,arr.length);}}

升序要進行建大堆,降序則建小堆。

堆排序使用堆來調整數據,效率就快很多。

時間復雜度:O(n*logn)

空間復雜度:O(1)

穩定性:不穩定。

5.冒泡排序

冒泡排序非常好理解,我們取數組最后一個元素,依次與前面的數對比。

 private static void pooubsort(int[] arr) {for (int i = 0; i < arr.length; i++) {for (int j = arr.length-1; j > 0 ; j--) {if(arr[j-1] > arr[j]){int tem = arr[j-1];arr[j-1] = arr[j];arr[j] = tem;}}}}

時間復雜度:O(n^2)

空間復雜度:O(1)

穩定性:穩定。

6.快速排序

快速排序是一種非常重要的排序,這里提供Hoare法和挖坑法,Hoare法的思想是取數組最左/右邊的值,將它設為基準值,先從右邊的第一個值開始,找到比基準值小的值,停下,開始從最左邊開始找? 比基準值大的值,也停下,交換兩個數,當left和right重合,交換基準值和兩下標重合位置的值。此時就完成了一次尋找。接下來就是對區間[left,pos-1]和[pos+1,right]分別進行上述調整。因此快排要運用到遞歸。

//快速排序Hoare法private static void quicksort1(int[] arr) {quick(arr,0,arr.length-1);}private static void quick(int[] arr, int left, int right) {if(left>=right){return;}int pos = parttion(arr,left,right);quick(arr,left,pos-1);quick(arr, pos+1, right);}private static int parttion(int[] arr, int left, int right) {int k = arr[left];int i = left;while(left<right){while(left<right&&arr[right]>=k){right--;}while(left<right&&arr[left]<=k){k++;}sweap(arr,left,right);}sweap(arr,left,i);return left;}private static void sweap(int[] arr, int left, int right) {int tem = arr[left];arr[left] = arr[right];arr[right] = tem;}

挖坑法:挖坑法是先將第一個數據放到一個臨時變量,形成一個坑位,從最右邊開始找比基準值小的數,讓它進入坑位,形成新的坑位,再從左邊開始找比基準值大的數,進坑。

private static void quicksort2(int[] arr) {quick1(arr,0,arr.length-1);}private static void quick1( int []arr,int left,int right) {if(left>=right){return;}int pos = parttion1(arr,left,right);quick1(arr,left,pos-1);quick1(arr,pos+1,right);}private static int parttion1(int[] arr, int left, int right) {int key = arr[left];while(left<right){while(left<right&&arr[right]>=key){right--;}arr[left] = arr[right];while(left<right&&arr[left]<=key){left++;}arr[right] = arr[left];}arr[left] = key;return left;}

時間復雜度:O(n*logn)

空間復雜度:O(logn)

穩定性:不穩定

7.歸并排序

歸并排序也是通過遞歸(分治法)進行排序,通過將數組分組,使子序列有序,然后讓子序列合并。

 private static void mergesort(int[] arr) {mergesortfunc(arr,0,arr.length-1);}private static void mergesortfunc(int [] arr,int left,int right) {if(left>=right){return;}int mid = (left+right)/2;mergesortfunc(arr,left,mid);mergesortfunc(arr,mid+1,right);merger(arr,left,mid,right);}private static void merger(int[] arr, int left, int mid, int right) {int s1 = left;int s2 = mid+1;int [] newarry = new int [right-left+1];int k = 0;while(s1<=mid&&s2<=right){if(arr[s1]>=arr[s2]){newarry[k] = arr[s2];k++;s2++;} else if (arr[s2]>arr[s1]) {newarry[k] = arr[s1];k++;s1++;}}while(s1<=mid){newarry[k++] = arr[s1++];}while(s2<=right){newarry[k++] = arr[s2++];}for (int i = 0; i < newarry.length; i++) {arr[i+left] = newarry[i];}}

歸并排序的缺點在于空間復雜度為O(N),歸并排序的思考更多在于磁盤外的排序,因為內存無法存儲這么多數據,所以要進行外部排序,歸并排序是最常用的外部排序。

時間復雜度:O(n*logn)

空間復雜度:O(N)

穩定性:穩定

8.快速排序的非遞歸實現

快排:首先要有一個棧,設置一個內置類,類中有left,right,將初始的范圍[0,arr.length-1]入棧。

 public Range(int right, int left) {this.right = right;this.left = left;}}private static void quicksortbyLoop(int[] arr) {Stack<Range> stack = new Stack<>();stack.push(new Range(0,arr.length-1));while(!stack.isEmpty()){Range range = stack.pop();while(range.left>=range.right){continue;}int pos = parttion(arr,range.left, range.right);stack.push(new Range(range.left,pos-1));stack.push(new Range(pos+1,range.right));}}

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

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

相關文章

Java——Random庫

一、作用 Random庫——生成隨機數 二、實現步驟 1.導包&#xff1a;import java.util.Random; #快捷鍵&#xff1a;“Random”回車鍵 2.取得隨機數&#xff1a;Random 變量1 new Random(); 3.調用隨機數&#xff1a;類型 變量2 變量1.nextInt(n); &#xff08;代表變量…

解線性方程組的直接方法:高斯消元法與其程序實現

解線性方程組的直接方法&#xff1a;高斯消元法與其程序實現 1.順序高斯消元法 設線性方程組 A x b \boldsymbol{Ax}\boldsymbol{b} Axb 如果 a k k ( k ) ≠ 0 a_{kk}^{\left( k \right)}\ne 0 akk(k)??0 可以通過高斯消元法轉化為等價的三角形線性方程組&#xff1a; …

LiteIDE中配置golang編譯生成無CMD窗口EXE的步驟

LiteIDE中配置golang編譯生成無CMD窗口EXE的步驟 一、環境配置1、設置GOROOT?2、配置GOPATH? 二、項目編譯參數設置1、新建/打開項目?2、修改編譯配置?3、其他優化選項&#xff08;可選&#xff09;? 三、構建與驗證1、編譯生成EXE?2、驗證無窗口效果? 四、注意事項 一、…

Maya基本操作

基本操作 按住ALT鍵&#xff0c;左鍵旋轉視角&#xff0c;中鍵平移視角&#xff0c;右鍵放大縮小視角。 按空格鍵切換4格視圖。 導入FBX格式文件后&#xff0c;無貼圖顯示。 按6鍵開啟。著色紋理顯示 坐標軸相關 修改菜單-左鍵最上面的虛線。固定修改選項窗口。 選中物體…

Windows打開ftp局域網共享

前提是windows已經設置好開機賬號密碼了&#xff0c;否則教程不適用 第一先打開電腦ftp共享配置 點擊保存即可 2.設置要共享到其他電腦的文件路徑&#xff08;如果你要共享整個盤你就設置整個盤&#xff0c;如果是共享盤中某文件就設置某文件&#xff0c;這里是某文件&#x…

overleaf中會議參考文獻使用什么標簽:inproceedings

overleaf中會議參考文獻使用什么標簽 會議論文在LaTeX文獻條目中應使用 @inproceedings 標簽,而非 @article。根據你提供的內容,修正后的格式如下: @inproceedings{asai2023self, author = {Asai, Akari and Wu, Zeqiu and Wang, Yizhong and Sil, Avirup and Hajishirzi,…

一文詳解redis

redis 5種數據類型 string 字符串是 Redis 里最基礎的數據類型&#xff0c;一個鍵對應一個值。 設置值 SET key value例如&#xff1a; SET name "John"獲取值 GET key例如&#xff1a; GET namelist 列表是簡單的字符串列表&#xff0c;按插入順序排序。 在列…

第16章:基于CNN和Transformer對心臟左心室的實驗分析及改進策略

目錄 1. 項目需求 2. 網絡選擇 2.1 UNet模塊 2.2 TransUnet 2.2.1 SE模塊 2.2.2 CBAM 2.3 關鍵代碼 3 對比試驗 3.1 unet 3.2 transformerSE 3.3 transformerCBAM 4. 結果分析 5. 推理 6. 下載 1. 項目需求 本文需要做的工作是基于CNN和Transformer的心臟左心室…

【AI】知識蒸餾-簡單易懂版

1 緣起 最近要準備升級材料&#xff0c;里面有一骨碌是介紹LLM相關技術的&#xff0c;知識蒸餾就是其中一個點&#xff0c; 不過&#xff0c;只分享了蒸餾過程&#xff0c;沒有講述來龍去脈&#xff0c;比如沒有講解Softmax為什么引入T、損失函數為什么使用KL散度&#xff0c;…

批量將PPT轉換成多張圖片

以下是一個使用Python將PowerPoint文件&#xff08;PPT/PPTX&#xff09;批量轉換為多張圖片的代碼示例。該方案通過comtypes庫調用本地Office的COM接口實現轉換&#xff0c;需確保已安裝Microsoft PowerPoint。 import os import comtypes.client from comtypes import COMEr…

單例模式的經典實現

單例模式&#xff08;Singleton&#xff09;是一種創建型設計模式&#xff0c;它確保一個類只有一個實例&#xff0c;并提供一個全局訪問點。在MyBatis、Redisson、AMQP等依賴包中&#xff0c;單例模式被廣泛應用。以下是這些框架中單例模式的經典實現及舉例&#xff1a; 1. My…

2024年數維杯數學建模B題生物質和煤共熱解問題的研究解題全過程論文及程序

2024年數維杯數學建模 B題 生物質和煤共熱解問題的研究 原題再現&#xff1a; 隨著全球能源需求的不斷增長和對可再生能源的追求&#xff0c;生物質和煤共熱解作為一種潛在的能源轉化技術備受關注。生物質是指可再生能源&#xff0c;源自植物和動物的有機物質&#xff0c;而煤…

靈茶山艾府基礎算法精講

day1 &#xff08;1遍&#xff09;167. 兩數之和 II - 輸入有序數組 https://leetcode.cn/problems/two-sum-ii-input-array-is-sorted/solution/san-shu-zhi-he-bu-hui-xie-xiang-xiang-sh-6wbq/ 15. 三數之和 https://leetcode.cn/problems/3sum/solution/shuang-zhi-zhen-…

圖解AUTOSAR_CP_LargeDataCOM

AUTOSAR LdCom模塊詳解 大型數據通信模塊的架構與實現 目錄 AUTOSAR LdCom模塊詳解 目錄1. 概述2. 模塊架構3. 數據流程 3.1 整體數據流3.2 數據發送流程3.3 數據接收流程4. 配置結構5. 總結1. 概述 LdCom(Large Data COM)是AUTOSAR中的輕量級通信模塊,專為高效傳輸大型或動…

Flink 自定義數據源:從理論到實踐的全方位指南

目錄 第一章:自定義數據源的基礎概念 數據源是什么?它在 Flink 中扮演什么角色? Flink 的內置數據源:開箱即用的 “標配” 為什么需要自定義數據源?它的殺手锏在哪? 第二章:自定義數據源的實現之道 接口選擇:從簡單到高級,選對工具事半功倍 SourceFunction:入門…

HarmonyOS Next~鴻蒙應用框架開發實戰:Ability Kit與Accessibility Kit深度解析

HarmonyOS Next&#xff5e;鴻蒙應用框架開發實戰&#xff1a;Ability Kit與Accessibility Kit深度解析 一、HarmonyOS應用框架設計理念 HarmonyOS作為全場景分布式操作系統&#xff0c;其應用框架設計遵循"一次開發&#xff0c;多端部署"的核心原則。通過創新的原…

Spring相關API

1是相對路徑 2 是絕對路徑 3 在注解時使用

Netty源碼—客戶端接入流程

1.關于Netty客戶端連接接入問題整理 一.Netty是在哪里檢測有新連接接入的&#xff1f; 答&#xff1a;boss線程第一個過程輪詢出ACCEPT事件&#xff0c;然后boss線程第二個過程通過JDK底層Channel的accept()方法創建一條連接。 二.新連接是怎樣注冊到NioEventLoop線程的&#x…

python全棧-前端

python全棧-前端 文章目錄 HTML標簽段落p、換行br、水平線hr圖片img路徑src超文本鏈接a超鏈接之錨點href#id文本有序列表ol無序列表ul自定義列表表格table表格屬性單元格合并 表單Forminput標簽HTML5新增type屬性HTML5新增常用屬性 實體字符塊元素與行內元素/內聯元素容器元素d…

領域驅動設計(DDD)實踐入門

文章目錄 1.認識領域驅動設計1.1 簡介1.2 發展歷史1.3 DDD 的興起 2.從一個簡單案例2.1 轉賬需求2.2 設計的問題2.3 違反的設計原則 3.使用 DDD 進行重構抽象數據存儲層抽象第三方服務抽象中間件封裝業務邏輯重構后的架構 4.小結參考文獻 1.認識領域驅動設計 1.1 簡介 領域驅…