Java基礎(七)排序算法

排序

1. 冒泡排序

>> 冒泡排序的思想
在這里插入圖片描述
冒泡排序是一種簡單的排序算法,其基本思想是通過多次遍歷待排序序列,依次比較相鄰的元素并交換位置,使得每次遍歷后最大(或最小)的元素冒泡到序列的末尾。具體步驟如下:

  1. 從待排序序列的第一個元素開始,依次比較相鄰的兩個元素。
  2. 如果前一個元素大于后一個元素,則交換這兩個元素的位置,使得較大的元素向后移動。
  3. 繼續比較下一對相鄰元素,重復上述操作,直到遍歷到序列的倒數第二個元素。
  4. 重復執行上述操作,每次遍歷使得最大的元素冒泡到序列的末尾。
  5. 重復以上步驟,直到所有元素都排序完成。

冒泡排序的時間復雜度為 O(n^2),其中n為待排序序列的長度。雖然冒泡排序的時間復雜度較高,在處理大規模數據時效率較低,但由于其簡單直觀的思想和實現方式,適用于小規模數據的排序任務

>> 冒泡排序代碼實現

public class BubbleSorting {public static void main(String[] args) {int[] arr = {46, 28, 69, 39, 4, 23, 76, 84, 78, 81, 18, 91, 27, 52};// 冒泡排序for (int i = 0; i < arr.length - 1; i ++) {for (int j = 0; j < arr.length - 1 - i; j ++) {if (arr[j] > arr[j + 1]) {arr[j] = arr[j] ^ arr[j +1];arr[j+1] = arr[j] ^ arr[j +1];arr[j] = arr[j] ^ arr[j +1];}}}System.out.println(Arrays.toString(arr));}
}
// 輸出:[4, 18, 23, 27, 28, 39, 46, 52, 69, 76, 78, 81, 84, 91]

2. 選擇排序

>> 選擇排序的思想
請添加圖片描述
選擇排序的思想是通過不斷地選擇未排序序列中的最小(或最大)元素,并將其放到已排序序列的末尾,逐步構建有序序列。具體步驟如下:

  1. 首先,將待排序序列分為兩部分:已排序序列和未排序序列。初始時,已排序序列為空,未排序序列包含待排序的所有元素。
  2. 在未排序序列中找到最小(或最大)的元素,記為最小值(或最大值)。
  3. 將最小值與未排序序列的第一個元素進行交換,將最小值放到已排序序列的末尾。
  4. 縮小未排序序列的范圍,將已排序序列增加一個元素,重復步驟2和步驟3,直到未排序序列為空。

通過不斷地選擇未排序序列中的最小(或最大)元素,并將其放到已排序序列的末尾,最終可以得到一個有序序列。

選擇排序的特點是簡單直觀,代碼實現相對較簡單,但效率較低。其時間復雜度為 O(n^2),其中n是待排序元素的數量。無論待排序序列的初始順序如何,選擇排序的比較次數和交換次數都是固定的,因此它的時間復雜度相對穩定。然而,由于每次都要進行交換操作,選擇排序在大規模數據的排序過程中效率較低,一般不適用于大規模或需要高效排序的場景

>> 選擇排序代碼實現

public class SelectSort2 {public static void main(String[] args) {int[] arr = {46, 28, 69, 39, 4, 23, 76, 84, 78, 81, 18, 91, 27, 52};// 選擇排序for (int i = 0; i < arr.length-1; i++) {int min = i;for (int j = i + 1; j < arr.length; j++) {if (arr[min] > arr[j]) {min = j;}}int temp = arr[i];arr[i] = arr[min];arr[min] = temp;}System.out.println(Arrays.toString(arr));}
}
// 輸出:[4, 18, 23, 27, 28, 39, 46, 52, 69, 76, 78, 81, 84, 91]

3. 插入排序

>> 插入排序的思想
在這里插入圖片描述
插入排序的思想是將待排序的元素逐個插入到已排序序列中的正確位置,從而逐步構建有序序列。具體步驟如下:

  1. 首先,將待排序序列分為兩部分:已排序序列和未排序序列。初始時,已排序序列只包含第一個元素,未排序序列包含剩余的元素。
  2. 從未排序序列中取出第一個元素,將其視為當前元素。
  3. 將當前元素與已排序序列從右往左進行比較,找到合適的位置插入。
  4. 將當前元素插入到已排序序列中的正確位置,同時調整已排序序列的元素位置,使其仍然保持有序。
  5. 重復步驟2至步驟4,直到未排序序列中的所有元素都被插入到已排序序列中。

通過不斷地將待排序序列中的元素插入到已排序序列的正確位置,最終可以得到一個有序序列。

插入排序的特點是相對于其他簡單排序算法(如選擇排序、冒泡排序),效率要高一些。其時間復雜度為O(n^2),其中n是待排序元素的數量。插入排序在對近乎有序的數據進行排序時,效果較好,而在對大規模亂序數據進行排序時,效率相對較低。盡管如此,插入排序的實現簡單,對于小規模或部分有序的數據集合,仍然是一種有效的排序方法。

>> 插入排序代碼實現

public class InsertSort {public static void main(String[] args) {int[] arr = {46, 28, 69, 39, 4, 23, 76, 84, 78, 81, 18, 91, 27, 52};for (int i = 1; i < arr.length; i++) {int index = i - 1;int num = arr[i];while (index >= 0 && num < arr[index]) {arr[index + 1] = arr[index];index --;}arr[index + 1] = num;}System.out.println(Arrays.toString(arr));}
}

4. 二分法查找

>> 二分法查找的思想
在這里插入圖片描述
二分法查找是一種高效的查找算法,適用于已排序的數組。其基本思想是將待查找區間不斷二分,通過比較目標值與中間元素的大小關系來確定下一步查找的范圍。具體步驟如下:

  1. 確定查找區間的起始和結束位置,通常為整個數組的起始和結束位置。
  2. 計算查找區間的中間位置 mid,可以取 (start + end) / 2。
  3. 比較目標值與中間元素的大小關系:
  4. 如果目標值等于中間元素,那么就找到了目標值,返回索引。
  5. 如果目標值小于中間元素,說明目標值可能在左半部分,更新結束位置為 mid - 1。
  6. 如果目標值大于中間元素,說明目標值可能在右半部分,更新起始位置為 mid + 1。
  7. 重復步驟 2 和步驟 3,直到目標值找到或者查找區間為空(起始位置大于結束位置)為止。

二分法查找的時間復雜度為 O(log n),其中 n 是待查找區間內元素的個數。這使得它成為處理大規模數據的一種高效算法。

需要注意的是,二分法查找要求待查找的數組必須是有序的,否則查找結果將不可靠。另外,如果數組中存在重復元素,二分查找可能無法找到第一個或最后一個目標值的索引,需要進行額外的處理。

>> 二分法查找代碼實現

public class BinarySearch {public static void main(String[] args) {int[] arr = {1,2,3,4,5,6};int key = 2;int index = binarySearch(arr, key);System.out.println(arr[index]);}// 二分法查找static int binarySearch(int[] arr, int key) {int left = 0, right = arr.length - 1;while (left <= right) {int mid = (left + right) >> 1;if (arr[mid] > key) {right = mid - 1;} else if (arr[mid] < key) {left = mid +1;} else {return mid;}}return -1;}
}

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

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

相關文章

SpringBoot+Mybatis-Plus實現增刪改查超詳細步驟

目錄 一、介紹 二、前期準備工作 &#xff08;一&#xff09; 創建springboot項目和創建數據庫 三、項目配置 &#xff08;一&#xff09;pom.xl導入相關依賴 1.導入依賴 &#xff08;二&#xff09;yml文件中配置連接數據庫 2.配置yml文件 四、代碼的編寫 數據庫展…

推斷統計(配對樣本t檢驗)

根據題目我們也可以看出配對樣本 t 檢驗是用來檢驗兩配對正態總體的均值是否存在顯著差異的一種假設檢驗方法&#xff0c;雖然是兩組數據但是其來自同一部分個體在兩個時間段內的測試數據&#xff0c;是同一部份個體&#xff01; 進行配對樣本 t 檢驗之后也是分別做出原假設和備…

【基礎學習筆記 enum】TypeScript 中的 enum 枚舉類型介紹

因為之前網上查好多博客都是只說最基礎的&#xff0c;所以這里記錄一下&#xff0c;最基礎的放在最后面。 這里重點要記錄的是枚舉成員的值可以是字符串&#xff08;字符串枚舉&#xff0c;因為網上大部分只介紹常數枚舉&#xff09;&#xff0c;需要注意的一點是&#xff0c;…

ADC實驗

查看VR1鏈接的絲印&#xff1a;XadcAIN3 設置相關寄存器 使用的是通道3&#xff0c;要設置相應的通道寄存器 #include "exynos_4412.h"int main() {unsigned int AdcValue 0;/*將ADC的精度設置成 12bit*/ADCCON ADCCON | (1 << 16);/*使能ADC的分頻器*…

SAP ABAP 直接把內表轉換成PDF格式(smartform的打印函數輸出OTF格式數據)

直接上代碼&#xff1a; REPORT zcycle055.DATA: lt_tab TYPE TABLE OF zpps001. DATA: ls_tab TYPE zpps001.ls_tab-werks 1001. ls_tab-gamng 150.00. ls_tab-gstrp 20201202. ls_tab-aufnr 000010000246. ls_tab-auart 標準生產. ls_tab-gltrp 20201205. ls_tab-matn…

MyBatis面試題

MyBatis面試題&#xff1a; 1、MyBatis是什么&#xff1f; Mybatis是一個半ORM&#xff08;對象關系映射&#xff09;框架&#xff0c;它內部封裝了JDBC&#xff0c;加載驅動、創建連接、創建statement等繁雜的過程&#xff0c;開發者開發時只需要關注如何編寫SQL語句&#xf…

榮耀X40 GT真機調試APP,HBuilder X刷新不到設備

今天使用榮耀X40GT進行真機調試App的時候&#xff0c;hbuilder怎么都刷不出來設備&#xff0c;經歷一番風雨最終連接成功&#xff0c;特此記錄一下。 我的設備Android版本12&#xff0c;MagicOS版本7.0&#xff0c;進行了如下配置&#xff1a; 1、打開“設置”-》“系統和更新”…

keil5突然編譯輸出框build output 不見了

今天keil5突然編譯輸出框build output 不見了&#xff0c;但可以編譯和下載。 首先嘗試&#xff0c;在view里面打開和關閉build output window&#xff0c;沒有反應&#xff1b; 其次&#xff0c;點擊window-reset view to defaults&#xff0c;果然build output又恢復了&#…

數據結構---圖

這里寫目錄標題 圖的基本概念和術語基本概念和術語1基本概念和術語2 圖的類型定義抽象數據類型定義二級目錄二級目錄 一級目錄二級目錄二級目錄二級目錄二級目錄二級目錄二級目錄 圖的基本概念和術語 基本概念和術語1 V代表頂點的有窮非空集合 E代表邊的有窮集合 n為頂點 有向…

數據結構與算法-棧(LIFO)(經典面試題)

一&#xff1a;面試經典 1. 如何設計一個括號匹配的功能&#xff1f;比如給你一串括號讓你判斷是否符合我們的括號原則&#xff0c; 棧 力扣 2. 如何設計一個瀏覽器的前進和后退功能&#xff1f; 思想&#xff1a;兩個棧&#xff0c;一個棧存放前進棧&…

Python爬蟲之解決瀏覽器等待與代理隧道問題

作為專業爬蟲程序員&#xff0c;我們往往需要應對一些限制性挑戰&#xff0c;比如瀏覽器等待和使用代理隧道。在Python爬蟲開發中&#xff0c;這些問題可能會導致我們的爬蟲受阻。本文將為你分享解決這些問題的方案&#xff0c;幫助你順利應對瀏覽器等待和代理隧道的挑戰&#…

【vue3】固定上導航欄和左側導航欄,只顯示其他內容在主內容區域

實現思路&#xff1a; 在一個單獨的vue組件文件中只寫出上導航欄和左側導航欄的內容將你想要展示的頁面主內容寫到單獨的組件中在index.js寫路由&#xff0c;將【想要展示的頁面主內容的路由】作為【子路由】寫在【只寫出上導航欄和左側導航欄的路由】的下面&#xff1b; 在el…

Oracle 開發篇+Java通過共享模式訪問Oracle數據庫

標簽&#xff1a;共享服務器進程、shared server process釋義&#xff1a;shared server process是Oracle的一種數據庫連接技術&#xff0c;類似的還有專用模式和DRCP ★ 數據庫配置 alter system set shared_server_sessions1 scopespfile; alter system set max_shared_serv…

AIGC|AGI究竟是什么?為什么大家都在爭先入場?

一、AI大語言模型進入爆發階段 2022年12月ChatGPT突然爆火&#xff0c;原因是其表現出來的智能化已經遠遠突破了我們的常規認知。雖然其呈現在使用者面前僅僅只是一個簡單的對話問答形式&#xff0c;但是它的內容化水平非常強大&#xff0c;甚至在某些方面已經超過人類了&#…

運動控制系統::幾篇大佬的文章

運動規劃 - 知乎 (zhihu.com) 運動規劃、運動控制 & 運動感知 - 知乎 (zhihu.com)

電腦屏幕閃爍?別慌!解決方法在這!

“我新買了一臺電腦&#xff0c;還沒用幾天呢&#xff0c;就出現了電腦屏幕閃爍的情況&#xff0c;這讓我感到很煩躁。有什么方法可以解決電腦屏幕閃爍的問題呢&#xff1f;” 使用電腦的過程中&#xff0c;我們不難發現電腦屏幕有時候會出現閃爍的情況&#xff0c;這會導致使用…

在線預覽Word、Excel、PowerPoint等文件

在我們工作時&#xff0c;經常會有在線查看各種不同類型的文件的需要&#xff0c;如Word文檔、Excel表格、PowerPoint幻燈片和PDF等。可以直接在這里預覽&#xff1a;https://www.compdf.com/webviewer/demo Word 文件實現前端預覽 方案一&#xff1a; 使用 XDOC 可以實現預…

vscode|pycharm + docker + python

1&#xff0c;docker run的時候要加上port docker run -it --gpusall -p 2222:22 -v /掛載目錄/:/docker 目錄1/ -v /掛載目錄/:/docker 目錄2/ --namexxx image:v2 /bin/bash 2&#xff0c;docker 內部要安裝ssh 2.1方法命令&#xff1a; apt-get update apt-get install…

使用藍牙外設卻不小心把臺式機電腦藍牙關了

起因 今天犯了一個賊SB的錯誤&#xff0c;起因是藍牙鍵盤突然就不能輸入了&#xff08;雖然是連接狀態&#xff0c;但是按什么鍵都沒有反應&#xff09; 原來我的解決方法就是重啟一下電腦&#xff0c;但是那會電腦開了賊多的軟件。我就想重啟也太麻煩了&#xff0c;既然重啟…

Linux版本 centOS 7,java連接mysql

在Linux下 使用java 訪問數據庫 &#xff0c; java 1.7版本&#xff0c; mysql 8.0.33版本&#xff0c; 連接驅動 mysql-connector-java-5.1.49.jar 代碼如下&#xff1a; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import ja…