【算法篇】八種內排序算法

常用的八種內排序算法分別是:

  1. 交換排序:冒泡排序、快速排序
  2. 選擇排序:簡單選擇排序、堆排序
  3. 插入排序:直接插入排序、希爾排序
  4. 歸并排序
  5. 基數排序

內排序巧記:選(選擇)艦(簡單選擇)隊(堆)的時候腳(交換)毛(冒泡)快(快速),需要把軌(歸并)跡(基數)擦(插入)仔(直接插入)細(希爾)

一、算法的概念和編碼實現(Java)

1、冒泡排序

冒泡排序的基本思想是,對相鄰的元素進行兩兩比較,順序相反則進行交換,這樣,每一趟會將最小或最大的元素“浮”到頂端,最終達到完全有序

代碼實現(升序)

	public static void selectSort(int[] array) {int len = array.length;boolean flag = true;for (int i = 0; i < len - 1 && flag; i++) {flag = false;for (int j = 0; j < len - i - 1; j++) {if (array[j] > array[j + 1]) {int temp = array[j];array[j] = array[j + 1];array[j + 1] = temp;flag = true;}}}}

?

最好情況的時間復雜度最壞情況的時間復雜度特點穩定性
T(n)=O(n)T(n)=O(n2)如果數據已經排序好,一次都不交換或者交換次數很少,效率很高;如果是完全逆序,則要不停的兩兩交換,效率很低穩定

2、簡單選擇排序

簡單選擇排序的基本思想是,每一趟從待排序的數據元素中選擇一個最小(或者最大)的元素作為首元素,直到所有元素排完為止。

代碼實現(升序):

	public static void selectSort(int[] array) {int len = array.length;for (int i = 0; i < len-1; i++) {int min = i;// 每趟排序默認第一個元素是最小的元素,記住下標for (int j = i + 1; j < len; j++) {// 從i+1的位置開始,依次同最小元素比較,若比最小元素小,則記住當前下標if (array[j] < array[min]) {min = j;}}// 無序區最小元素同無序區的第一個元素交換if (min != i) {int temp = array[min];array[min] = array[i];array[i] = temp;}}}
時間復雜度特點穩定性
T(n)=O(n2)簡單,相對于冒泡排序來說交換次數少不穩定

3、直接插入排序

直接插入排序基本思想是不斷將無序區的元素插入到有序區的適當位置,直到無序區沒有元素排完為止

代碼實現(升序):

	private static void insertSort(int[] array) {for (int i = 1; i < array.length; i++) {int j ;int temp = array[i];for (j = i; j>0 && temp < array[j-1]; j--) {array[j] = array[j-1];}array[j] = temp;}}

?

最好情況的時間復雜度最壞情況的時間復雜度特點穩定性
T(n)=O(n)T(n)=O(n2)簡單穩定

4、快速排序

對冒泡排序的一種改進,它的思想是:將元素分為兩組,一組的元素比另外一組的所有元素都要小,然后再按照此方法對兩組元素進行排序。

快速排序我這里就不寫了,快速排序相對于前面三種排序方式來說要復雜很多,看了一些博客,發現寫得都不怎么樣,這里推薦一個講快速排序的視頻https://www.bilibili.com/video/av39519566/?redirectFrom=h5

附上代碼實現(參考視頻中的):

public static void quickSort(int[] arr,int left,int right){//如果左邊索引比右邊索引更大或者相等,直接使用return結束這個方法if(left >= right){return;}//定義變量保存基準數int base = arr[left];//定義變量i,指向最左邊int i = left;//定義變量j,指向最右邊int j = right;//當i和j不相遇的時候,在循環中進行檢索while(i!=j){//先由j從右向左檢索比基準數小的就停下,否則繼續檢索while(arr[j]>=base && i<j){j--;}//在由i從左向右檢索比基準數大的就停下,否則繼續檢索while(arr[i]<=base && i<j){i++;}//代碼走到這里,i停下了,j也停下了,然后交換i和j位置的元素int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}//交換基準數和相遇位置的元素arr[left] = arr[i];arr[i] = base;//排基準數左邊的quickSort(arr,left,i-1);//排基準數右邊的quickSort(arr,j+1,right);}
最好情況的時間復雜度最壞情況的時間復雜度平均時間復雜度特點穩定性
T(n)=O(nlogn)T(n)=O(n2)T(n)=O(nlogn)較復雜不穩定

5、希爾排序

希爾排序是對直接插入排序的優化,原理是:將數據按照步長dk分為dk個子列,然后再對每個子列運用直接插入排序。

當步長為5的時候,分組情況如下:

?

每個子列排好序后,變成:

代碼實現(升序):

	public static void main(String[] args) {int[] array = {49,38,65,97,76,13,27,49,55,4};print(array);ShellSort(array,5);print(array);ShellSort(array,3);print(array);ShellSort(array,1);print(array);}private static void print(int[] array){for (int i = 0; i < array.length; i++) {System.out.print(array[i]+"\t");}System.out.println("\n");}//希爾排序,dk表示步長private static void ShellSort(int[] array,int dk) {for(int k = 0;k<dk;k++){//每個子組做直接插入插入排序for(int i = dk+k;i<array.length;){int j ;int temp = array[i];for (j = i; j-dk>=0 && temp < array[j-dk]; ) {j -= dk;//上一個元素的索引需要減去dk,而不是減1array[j] = array[j-dk];}array[j] = temp;i += dk;//下一個元素索引加上dk,而不是加1}}}

說明:從代碼層面來看,希爾排序相對于直接插入排序的不同點在于希爾排序外層多了一層循環,用來將原序列分層若干個子列。內部的直接插入排序做減減或者加加時要改成減去步長或者加上步長

二、時間復雜度和空間復雜度分析

排序的穩定性:根據關鍵字相同(如果數值比較的話是指大小)的記錄排序前后相對位置的變化,可以分為穩定性排序算法和不穩定性排序算法。在排序的序列中,如果存在兩個記錄Ri和Rj,其關鍵字分別為Ki和Kj,并且i<=j,Ki=Kj,即記錄Ri在Rj之前,排序完成后,如果記錄Ri和Rj的相對位置不發生改變,那么該算法是穩定性排序,否則是不穩定排序。

排序方法時間復雜度(最壞情況)空間復雜度(輔助空間)穩定性復雜性
簡單選擇排序O(n2)O(1)不穩定簡單
冒泡排序O(n2)O(1)穩定簡單
快速排序O(n2)?不穩定較復雜
直接插入排序O(n2)O(1)穩定簡單
希爾排序O(n2)O(1)不穩定較復雜

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

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

相關文章

數據分析專題報告范文6篇_小學生看圖寫話范文:小熊玩蹺蹺板?(6篇),讓孩子參考練習...

?范文01&#xff1a;小熊蹺蹺板一天&#xff0c;天氣晴朗&#xff0c;胖乎乎的小熊和小白兔一起玩蹺蹺板。小熊一屁股坐在地上&#xff0c;小白兔說&#xff1a;“啊&#xff01;我有恐高癥哇&#xff01;”小熊說&#xff1a;“我比你重&#xff0c;所以你沒有辦法把我翹起來…

PL/SQL

1 PL/SQLPL/SQL:過程化SQL語言&#xff08;Procedural Language/SQL&#xff09;。PL/SQL是Oracle數據庫對SQL語句的擴展。在普通SQL語句的使用上增加了編程語言的特點&#xff0c;所以PL/SQL把數據操作和查詢語句組織在PL/SQL代碼的過程性單元中&#xff0c;通過邏輯判斷、循環…

20sccm_SCCM 2012安裝圖解教程(一步一步詳細步驟)

本系列文章的環境架構如下圖所示&#xff1a;所有服務器安裝的操作系統都是windows Server 2008 R2 中文企業版。計算機名軟件、版本及角色SC-DC.SC.COMwindows Server 2008 R2 Enterprise /Active Directory 2008 R2SC-SQL.SC.COMSQL Server 2008 R2 EnterpriseSC-SCCM.SC.COM…

【Java中級篇】Dom4j解析xml數據

一、依賴 <dependency><groupId>dom4j</groupId><artifactId>dom4j</artifactId><version>1.6.1</version></dependency> 二、test.xml <?xml version"1.0" encoding"UTF-8"?> <students>…

redis 附近的人_使用redis—geo api實現搜索附近的人,自己寫的一個composer包

安裝如果是應用在項目當中的話找到根目錄&#xff0c;需要和 composer.json同級composer require gaopengfei/redis_lbs基本操作初始化require_once __DIR__./vendor/autoload.php;$lbs new \LBS\Services\LBSService();添加$add_params [[name > yabao_road,long > 11…

【Java中級篇】使用zxing生成二維碼

一、pom.xml添加依賴 <dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.1.0</version></dependency><dependency><groupId>com.google.zxing</groupId><artifa…

微信小程序彈出框豎向滾動_微信小程序 解決自定義彈出層滑動時下層頁面滾動問題...

WXML將整個底層頁面使用 scroll-view 包裹起來&#xff0c;設置 scroll-y 當顯示彈出層的時候為 true&#xff0c; 閉關彈出層的時候為 falseWXSSPage 設置為絕對定位&#xff0c;寬高各百分之百 &#xff0c; scroll-view 高度 百分之百Page{position: absolute;width: 100%;h…

win10環境安裝使用svn客戶端和服務端

一、下載安裝包 安裝包下載傳送門http://subversion.apache.org/packages.html 無法下載的童鞋去百度云下載 鏈接&#xff1a;https://pan.baidu.com/s/1EuGohoZKIPmRvynp5-Subw 提取碼&#xff1a;ohna 鏈接&#xff1a;https://pan.baidu.com/s/1EJrd5DzGCBE4rRfdhuno6Q …

openglshader實現虛擬場景_opengl – 如何使用GLSL著色器將徑向模糊應用于整個場景?...

我在GLSL中有一個徑向模糊著色器,它采用紋理,對其進行徑向模糊,并將結果呈現給屏幕.這個工作很好,到目前為止.問題在于,它將徑向模糊應用于場景中的第一個紋理.但是我實際上想做的就是將這個模糊應用于整個場景.實現此功能的最佳方式是什么&#xff1f;我可以只使用著色器,還是…

記一次尷尬的面試

昨天信達雅公司邀請我去平安面試&#xff0c;然后我今天10點到科技信息中心&#xff0c;等了接近20分鐘才有人過來接我。 第一個環節是機試 40個題目&#xff0c;主要是選擇題&#xff0c;花了40分鐘結束戰斗&#xff0c;總分100得了75分&#xff08;手機快沒電了&#xff0c…

所選元素非聯通_非固化橡膠瀝青防水涂料與耐根穿刺防水卷材(瀝青基)施工要點...

目前&#xff0c;非固化復合耐根穿刺防水卷材在車庫頂板的應用逐漸受到客戶及用戶的認可&#xff0c;也有不少慕名而來的防水從業者打電話來咨詢此系統的應用情況及優勢。下面就由小編來給大家系統介紹此應用系統的特點吧。01性能優勢1.兩種材料高度的相容性非固化橡膠瀝青防水…

事務的理解

事務的概念 事務是一組SQL組成的邏輯處理單元&#xff0c;通常有四個特性&#xff0c;簡稱ACID&#xff1a; 原子性&#xff08;Atomic&#xff09;&#xff1a;數據庫事務是不可分割的工作單位。事務中的SQL語句要么都執行成功&#xff0c;要么都執行失敗。 一致性&#xf…

vscode設置templates_在VScode中創建你的代碼模板的方法

使用VScode的用戶代碼片段功能&#xff0c;來生成自己習慣的代碼模板&#xff0c;提升開發效率1.選擇菜單里的 文件 > 首選項 > 用戶代碼片段2.選擇你需要自定義模板的文件&#xff0c;以vue為例3. 配置對應文件json把代碼片段寫在json里。每個代碼段都是在一個代碼片段名…

【Java中級篇】動態代理機制

要想搞明白動態代理之前&#xff0c;我們先來了解一下代理是什么意思&#xff0c;先來談談設計模式中的代理模式。 什么是代理模式&#xff08;Proxy&#xff09; 定義&#xff1a;給目標對象提供一個代理對象&#xff0c;并由代理對象控制對目標對象的引用。 在代理模式中&…

二維分類教案_幼兒園中班數學教案中班數學教案二維排序——師樂匯幼兒教師教育網...

中班數學教案&#xff1a;二維排序一、活動目標&#xff1a;1. 在分類的基礎上初步運用二維排列表進行物品放置。2. 通過場景設置、溫故知新由易到難的課程安排&#xff0c;幼兒能積極參與大膽表達并且根據表格來進行物品放置。3&#xff0e;在生活化的情境中體驗學習數學活動的…

【JAVA基礎篇】String類詳解

昨天參加了一場機試&#xff0c;發現自己居然對String類的api不熟了&#xff0c;所以今天來總結一下&#xff08;基于JDK1.8&#xff09;。 1、父類和實現的接口 沒有父類&#xff0c;或者說父類是Object 接口&#xff1a;Serializable、Comparable<String>、CharSequ…

python精確計時_PYTHON在WINDOWS下高精度計時的體會

2011-02-23 14:51:19其實也是WINDOWS下的通用辦法啦&#xff0c;只不過我用PYTHON表達。用win32api.GetSystemTime()不是太精確&#xff0c;值15毫秒才變一下&#xff0c;最好用time.clock()&#xff0c;這個能到毫秒級&#xff0c;最精確的辦法是用QueryPerformanceFrequency(…

什么叫大數據人物畫像_大數據時代,如何構建精準用戶畫像,直擊精細化運營...

移動互聯網時代&#xff0c;精細化運營逐漸成為企業發展的重要競爭力&#xff0c;“用戶畫像”的概念也應運而生。用戶畫像是指&#xff0c;在大數據時代&#xff0c;企業通過對海量數據信息進行清洗、聚類、分析&#xff0c;將數據抽象成標簽&#xff0c;再利用這些標簽將用戶…

【Java中級篇】使用itextpdf生成PDF

我們可以發現很多求職網站都會將我們錄入的信息來生成一個PDF簡歷文件。所以我這里提供了用itextpdf生成的PDF的代碼。 一、步驟 1.1、使用Adobe Acrobat Pro工具編輯PDF模板 1.2、根據PDF模板文件路徑創建一個PDFReader對象 1.3、創建一個輸出流對象&#xff0c;用于存放生…

adb bugreport保存位置_adb 常用命令---日常提升效率

做為 Android 開發&#xff0c;怎么能不懂點 adb 命令呢&#xff1f;速看~adb 重置、斷連的狀況這里不說了&#xff0c;先來說一些直觀的命令吧1、adb devices查看當前連接的設備如果當前正在連接著設備&#xff0c;那么就可以進行后續的操作了&#xff0c;如果沒有&#xff0c…