算法 java 排序和查找

排序和查找

  • 冒泡排序(穩定)
  • 選擇排序(不穩定)
  • 插入排序(穩定)
  • 希爾排序(不穩定)
  • 歸并排序(穩定)
  • 快速排序(不穩定)
  • 堆排序
  • 計數排序
  • 桶排序
  • 基數排序
  • 二分查找

在這里插入圖片描述
在這里插入圖片描述

參考: 排序算法總結

冒泡排序(穩定)

經過多次迭代,通過相鄰元素之間的比較與交換,使值較小的元素逐步從后面移到前面,值較大的元素從前面移到后面。

這個過程就像水底的氣泡一樣從底部向上「冒泡」到水面,這也是冒泡排序法名字的由來。

接下來,我們使用「冒泡」的方式來模擬一下這個過程。

首先將數組想象是一排「泡泡」,元素值的大小與泡泡的大小成正比。
然后從左到右依次比較相鄰的兩個「泡泡」:
如果左側泡泡大于右側泡泡,則交換兩個泡泡的位置。
如果左側泡泡小于等于右側泡泡,則兩個泡泡保持不變。

這趟遍歷完成之后,最大的泡泡就會放置到所有泡泡的最右側,就像是「泡泡」從水底向上浮到了水面。
在這里插入圖片描述

public class BubbleSort {public static void bubbleSort(int[] arr) {int len = arr.length;for (int i = 0; i < len - 1; i++) {boolean flag = true;for (int j = 0; j < len - i - 1; j++) {if (arr[j] > arr[j + 1]) {int tmp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = tmp;flag = false;}}if (flag) {break;}}}
}

選擇排序(不穩定)

將數組分為兩個區間:左側為已排序區間,右側為未排序區間。每趟從未排序區間中選擇一個值最小的元素,放到已排序區間的末尾,從而將該元素劃分到已排序區間。

算法步驟

  1. 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置;
  2. 再從剩余未排序元素中繼續尋找最小(大)元素,然后放到已排序序列的末尾;
  3. 重復第2步,直到所有元素均排序完畢。
    在這里插入圖片描述
public class SelectionSort {public static void selectionSort(int[] arr) {int len = arr.length;for (int i = 0; i < len - 1; i++) {int minVal = i;for (int j = i + 1; j < len; j++) {if (arr[minVal] > arr[j]) {minVal = j;}}if (minVal != i) {int tmp = arr[i];arr[i] = arr[minVal];arr[minVal] = tmp;}}}
}

插入排序(穩定)

將數組分為兩個區間:左側為有序區間,右側為無序區間。每趟從無序區間取出一個元素,然后將其插入到有序區間的適當位置

算法步驟

  1. 首先從第一個元素開始,該元素被認為是有序的;
  2. 取出下一個元素,在已經排序的元素序列中從后往前進行掃描;
  3. 如果該已排好序的元素大于新元素,則將該元素移到下一位置;
  4. 重復步驟3一直往前進行掃描比較,直到找到已排序的元素小于或者等于新元素的位置;
  5. 將新元素插入到該位置后;
  6. 重復步驟2~5。
    在這里插入圖片描述
public class InsertionSort {public static void insertionSort(int[] arr) {for (int i = 1; i < arr.length; i++) {int val = arr[i], j = i;while (j > 0 && val < arr[j - 1]) {arr[j] = arr[j - 1];j--;}arr[j] = val;}}
}

希爾排序(不穩定)

將整個數組切按照一定的間隔取值劃分為若干個子數組,每個子數組分別進行插入排序。然后逐漸縮小間隔進行下一輪劃分子數組和對子數組進行插入排序。直至最后一輪排序間隔為1,對整個數組進行插入排序。
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

算法步驟

  1. 選擇一個增量序列{t1, t2, …, tk};
  2. 按增量序列個數k,對序列進行k趟排序;
  3. 每趟排序,根據對應的增量t,將待排序列分割成若干長度為m的子序列,分別對各子表進行直接插入排序。僅增量因子為1時,整個序列作為一個表來處理,表長度即為整個序列的長度。
    其中,增量gap=length/2,縮小增量繼續以gap = gap/2的方式,這種增量選擇我們可以用一個序列來表示,{n/2, (n/2)/2, …, 1},稱為增量序列。一般的增量序列都選擇以上說明的這個,但不一定是最優的。
public class ShellSort {public static void shellSort(int[] arr) {int len = arr.length, tmp, j;for (int gap = len / 2; gap >= 1; gap = gap / 2) {for (int i = gap; i < len; i++) {tmp = arr[i];j = i - gap;while (j >= 0 && arr[j] > tmp) {arr[j + gap] = arr[j];j -= gap;}arr[j + gap] = tmp;}}}
}

歸并排序(穩定)

采用經典的分治策略,先遞歸地將當前數組平均分成兩半,然后將有序數組兩兩合并,最終合并成一個有序數組。
在這里插入圖片描述
以下是ACWing版本的java模板

public class MergeSort {// 歸并排序private static void merge_sort(int[] arr, int l, int r) {// 遞歸結束條件if (l >= r) return;// 以下都為邏輯部分int mid = l + ((r - l) >> 1);merge_sort(arr, l, mid);merge_sort(arr, mid + 1, r);int[] tmp = new int[r - l + 1]; // 臨時數組, 用于臨時存儲 [l,r]區間內排好序的數據int i = l, j = mid + 1, k = 0;  // 兩個指針// 進行歸并while (i <= mid && j <= r) {if (arr[i] <= arr[j]) tmp[k++] = arr[i++];elsetmp[k++] = arr[j++];}while (i <= mid) tmp[k++] = arr[i++];while (j <= r) tmp[k++] = arr[j++];// 進行賦值for (i = l, j = 0; i <= r; i++, j++)arr[i] = tmp[j];}
}

快速排序(不穩定)

采用經典的分治策略,選擇數組中某個元素作為樞軸,通過一趟排序將數組分為獨立的兩個子數組,一個子數組中所有元素值都比樞軸小,另一個子數組中所有元素值都比樞軸大。然后再按照同樣的方式遞歸的對兩個子數組分別進行快速排序,以達到整個數組有序。

以下是ACWing版本的java模板

// 快速排序算法模板(選用)public static void quickSort(int[] q,int l,int r){if(l>=r)return;int i = l-1, j = r+1, x = q[l+r>>1]; //2. 因為j不能取到右邊界,所以取下界(q[l]或q[l+r>>1])while(i<j){do i++; while(q[i]<x);do j--; while(q[j]>x);if(i<j){int tmp = q[i];q[i]=q[j];q[j]=tmp;}}quickSort(q,l,j);  //1. j不能取到右邊界,若取到則會無限遞歸下去 此時q[j]<=x,q[j+1]>=x而x是2.中定義的quickSort(q,j+1,r); }
// 快速排序算法模板(其他)public static void quickSort(int[] q,int l,int r){if(l>=r)return;int i = l-1, j = r+1, x = q[l+r+1>>1]; //2. 因為i不能取到左邊界,所以取上界(q[r]或q[l+r+1>>1])while(i<j){do i++; while(q[i]<x);do j--; while(q[j]>x);if(i<j){int tmp = q[i];q[i]=q[j];q[j]=tmp;}}quickSort(q,l,i-1);  quickSort(q,i,r); //1. i不能取到左邊界,若取到則會無限遞歸下去 此時q[i-1]<=x,q[i]>=x,而x是2.中定義的}

堆排序

計數排序

桶排序

基數排序

二分查找

二分查找算法(Binary Search Algorithm):也叫做折半查找算法、對數查找算法,是一種用于在有序數組中查找特定元素的高效搜索算法。

二分查找的基本算法思想為:通過確定目標元素所在的區間范圍,反復將查找范圍減半,直到找到元素或找不到該元素為止。

整數二分法模板(ACWing版)
二分的本質是邊界
二分法用于查找, 每次都選擇答案所在的區間再次進行查找, 當區間長度為 1時, 就是答案

// 模板一
// 區間[l, r]被劃分成 [l, mid] 和 [mid+1, r]時使用
int bsearch_1(int l, int r) {while (l < r) {int mid = l + r >> 1;if (check[mid)  // check() 判斷 mid是否滿足性質r = mid; elsel = mid + 1;}return l;
}
// 模板二
// 區間[l, r]被劃分成 [l, mid-1] 和 [mid, r]時使用
int bsearch_2(int l, int r) {while (l < r) {int mid = l + r + 1 >> 1;   // 注意if (check[mid)  // check() 判斷 mid是否滿足性質l = mid;elser = mid - 1;}return l;
}
/* 如何選擇模板:
根據 check(mid)來判斷 r和 l的取值范圍
根據取值范圍選擇 mid是否有 + 1操作
mid歸于左邊, r = mid, mid選擇 不 +1
mid歸于右邊, l = mid, mid選擇 +1 */

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

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

相關文章

YOLOv8+PyQt5海洋船只檢測(可以重新訓練,yolov8模型,從圖像、視頻和攝像頭三種路徑識別檢測)

1.效果視頻&#xff1a;海洋船只檢測yoloV8檢測&#xff08;https://mbd.pub/o/bread/mbd-ZpaYk55r&#xff09;_嗶哩嗶哩_bilibili資源包含可視化的海洋船只檢測系統&#xff0c;可對于高空拍攝到的海洋圖片進行輪船檢測&#xff0c;基于最新的YOLOv8訓練的海洋船只檢測模型&a…

多線程知識-11

Runnable 和 Thread 用哪個好 使用Runnable接口的好處是&#xff1a; 避免了單繼承的限制&#xff1a;當你的類已經繼承了另一個類時&#xff0c;你仍然可以實現Runnable接口來創建線程。提高代碼的復用性&#xff1a;你可以將Runnable對象傳遞給多個線程來執行&#xff0c;從…

C++設計模式-策略模式,AI角色動態選擇行為

運行在VS2022&#xff0c;x86&#xff0c;Debug下。 27. 策略模式 策略模式讓算法的選擇與使用獨立開來&#xff0c;使得代碼更靈活、可擴展和易維護。應用&#xff1a;如在游戲開發中&#xff0c;AI角色需要根據環境和條件做出不同的行為&#xff0c;如尋路、攻擊、躲避等。可…

深度解析CSS中為什么會有Stacking Context的概念

CSS中的堆疊上下文&#xff08;Stacking Context&#xff09;概念是為了管理和控制網頁元素的重疊順序而引入的。堆疊上下文的引入解決了以下幾個關鍵問題&#xff1a; 層次管理&#xff1a; 在網頁中&#xff0c;多個元素可能會相互重疊&#xff0c;堆疊上下文定義了這些元素的…

01-CompressionWebpackPlugin---提高 Web 應用性能的利器

CompressionWebpackPlugin—提高 Web 應用性能的利器 筆記分享 在現代 Web 開發中&#xff0c;優化資源加載速度是提升用戶體驗的重要環節。減少文件大小可以顯著提升網頁加載速度&#xff0c;從而改善用戶體驗。CompressionWebpackPlugin 是一個強大的 Webpack 插件&#xff…

【安裝筆記-20240529-Windows-Electerm 終端工具】

安裝筆記-系列文章目錄 安裝筆記-20240529-Windows-Electerm 終端工具 文章目錄 安裝筆記-系列文章目錄安裝筆記-20240529-Windows-Electerm 終端工具 前言一、軟件介紹名稱&#xff1a;Wireshark主頁官方介紹功能特性 二、安裝步驟測試版本&#xff1a;electerm-1.39.35-win-…

【藍橋杯】常見的數據結構

&#x1f338;個人主頁&#xff1a;Yang-ai-cao &#x1f4d5;系列專欄&#xff1a;藍橋杯 C語言 &#x1f34d;博學而日參省乎己&#xff0c;知明而行無過矣 目錄 &#x1f338;個人主頁&#xff1a;Yang-ai-cao &#x1f4d5;系列專欄&#xff1a;藍橋杯 C語言 &…

Spring項目中Ordered接口的應用:全局過濾器(GlobalFilter)的順序控制

在Spring框架&#xff0c;尤其是Spring Cloud Gateway或Spring WebFlux項目中&#xff0c;Ordered接口扮演著重要的角色&#xff0c;特別是在實現全局過濾器(GlobalFilter)時&#xff0c;用于控制過濾器執行的優先級。下面將介紹如何在Spring項目中使用Ordered接口來管理Global…

【AIoT-Robot】3d hand pose

手語是聾啞人士的主要溝通工具,它是利用手部和身體的動作來傳達意義。雖然手語幫助它的使用者之間互相溝通,但聾啞人士與一般人的溝通卻十分困難,這個溝通障礙是源于大部分人不懂得手語。 1. 手勢&&手語 手勢:手的姿勢 ,通常稱作手勢。它指的是人在運用手臂時,所…

初識springcloud

springcloud eureka eureka的作用 消費者該如何獲取服務提供者具體信息&#xff1f; 服務提供者啟動時向eureka注冊自己的信息,eureka保存這些信息消費者,根據服務名稱向eureka拉取提供者信息 如果有多個服務提供者&#xff0c;消費者該如何選擇&#xff1f; 服務消費者利…

創建模塊

自學python如何成為大佬(目錄):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 在Python中&#xff0c;自定義模塊有兩個作用&#xff1a;一個是規范代碼&#xff0c;讓代碼更易于閱讀&#xff0c;另一個是方便其他程序使用已經編…

ORACLE創建dblink

dblink的作用 dblink數據庫鏈接顧名思義就是數據庫的鏈接&#xff0c;當我們要跨本地數據庫&#xff0c;訪問另外一個數據庫表中的數據時&#xff0c;本地數據庫中就必須要創建遠程數據庫的dblink&#xff0c;通過dblink本地數據庫可以像訪問本地數據庫一樣訪問遠程數據庫表中…

Ubuntu22.04之解決:terminal使用alt+1/alt+2/alt+3失效問題(二百三十八)

簡介&#xff1a; CSDN博客專家&#xff0c;專注Android/Linux系統&#xff0c;分享多mic語音方案、音視頻、編解碼等技術&#xff0c;與大家一起成長&#xff01; 優質專欄&#xff1a;Audio工程師進階系列【原創干貨持續更新中……】&#x1f680; 優質專欄&#xff1a;多媒…

安卓玩機搞機技巧綜合資源----電腦控制手機 投屏操控的軟件工具操作步驟解析【二十二】

接上篇 安卓玩機搞機技巧綜合資源------如何提取手機分區 小米機型代碼分享等等 【一】 安卓玩機搞機技巧綜合資源------開機英文提示解決dm-verity corruption your device is corrupt. 設備內部報錯 AB分區等等【二】 安卓玩機搞機技巧綜合資源------EROFS分區格式 小米紅…

外發郵件監控的六種方法, 監控軟件如何防止郵件泄密?

外發郵件監控的六種方法&#xff0c; 監控軟件如何防止郵件泄密&#xff1f; 外發郵件監控是現代企業信息安全管理的重要組成部分&#xff0c;它有助于防止敏感信息泄露、保護知識產權、以及確保企業合規。以下是外發郵件監控的幾種主要方法&#xff0c;這些方法結合使用可以為…

2024最新 Jenkins + Docker實戰教程(八)- Jenkins實現集群并發構建

&#x1f604; 19年之后由于某些原因斷更了三年&#xff0c;23年重新揚帆起航&#xff0c;推出更多優質博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有堅忍不拔之志 &#x1f390; 個人CSND主頁——Mi…

【Python Cookbook】S01E14 從字典中提取子集

目錄 問題解決方案討論 問題 如果我們想基于一個字典的子集創建另外一個字典&#xff0c;該如何做&#xff1f; 解決方案 利用 字典推導式 來解決問題&#xff1a; prices {ACME: 45.23,AAPL: 612.78,IBM: 205.55,HPQ: 37.20,FB: 10.75 }p1 {key:value for key, value in…

AI學習指南機器學習篇-邏輯回歸損失函數和優化

AI學習指南機器學習篇-邏輯回歸損失函數和優化 引言 在機器學習中&#xff0c;邏輯回歸是一種常用的分類算法。在邏輯回歸中&#xff0c;我們需要定義一個損失函數來衡量模型預測值與實際標簽之間的誤差&#xff0c;并且需要通過優化算法來最小化損失函數&#xff0c;從而得到…

群體優化算法----人工蜂群優化算法應用于路徑規劃(機器人避開平面障礙尋找最短路線)

介紹 人工蜂群優化算法&#xff08;Artificial Bee Colony Algorithm, ABC&#xff09;是由Dervis Karaboga在2005年提出的一種模擬蜜蜂覓食行為的優化算法。該算法基于蜜蜂群體的分工合作和信息交流機制&#xff0c;通過模擬蜜蜂尋找食物源的過程來解決優化問題。ABC算法因其…

netplan網絡配置@ubuntu留檔

ubuntu使用netplan進行網絡配置&#xff0c;簡單又方便。 配置的時候編輯/etc/netplan 目錄里的文件即可&#xff0c;如00-installer-config.yaml文件。 固定ip配置 network:ethernets:enp0s5:dhcp4: noaddresses: [192.168.1.7/24]routes:- to: defaultvia: 192.168.1.1name…