日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

结构与算法(04):排序规则与查找算法

發(fā)布時間:2025/3/16 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 结构与算法(04):排序规则与查找算法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

本文源碼:GitHub·點這里 || GitEE·點這里

一、遞歸算法

遞歸就是方法自己調(diào)用自己,每次調(diào)用時傳入不同的變量,可以讓代碼變得簡潔。遞歸算法在計算機科學(xué)中是指一種通過重復(fù)將問題分解為同類的子問題而解決問題的方法,遞歸式方法可以被用于解決很多的計算機科學(xué)問題,因此它是計算機科學(xué)中十分重要的一個概念。

基礎(chǔ)案例:通過遞歸打印數(shù)據(jù);

public class M01_Recursion {public static void main(String[] args) {printNum(3);}private static void printNum (int num){if (num > 1){printNum(num-1);}System.out.println("num="+num);} }

遞歸圖解

基于棧結(jié)構(gòu)的特點,遞歸調(diào)用會形成如上的結(jié)構(gòu),當(dāng)所有遞歸方法入棧成功后,在依次執(zhí)行出棧動作,打印數(shù)據(jù)結(jié)果。

在實際開發(fā)中遞歸經(jīng)常用來接近樹結(jié)構(gòu)問題,階乘算法,排序查找等數(shù)學(xué)類問題。

遞歸算法的條件必須要不斷接近退出條件,不然很容易出現(xiàn)無限循環(huán)導(dǎo)致內(nèi)存溢出異常問題。

二、排序算法

排序算法就是使一組數(shù)據(jù)記錄,按照特定的排序策略,遞增或遞減的排列起來的操作;常用的排序算法:冒泡排序,選擇排序,插入排序,希爾排序,歸并排序,快速排序,基數(shù)排序等;排序算法選擇:不同的排序業(yè)務(wù)可以通過多種算法測試,復(fù)雜度低,耗時短的優(yōu)先使用。

1、冒泡排序

通過對排序序列依次比較相鄰元素的值,若發(fā)現(xiàn)逆序則交換,使值較大的元素逐漸從前移向后部,算法的名字由來是因為越小的元素會經(jīng)由排序交換慢慢浮到數(shù)列的一端,就如同碳酸飲料中二氧化碳的氣泡最終會上浮到頂端一樣,故名冒泡排序。

public class M02_Bubble {public static void main(String[] args) {int[] arr = {3,7,5,9,6};bubbleSort(arr);for (int num:arr){System.out.println(num);}}public static void bubbleSort(int[] arr) {// 聲明臨時變量int temp = 0;// 排序總趟數(shù)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]) {// 位置交換temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}} }

核心思路

排序趟數(shù)只有多少元素,理論上要進行處理的次數(shù);每個元素的位置交換都需要一次完整對比,外層循環(huán)總控制。內(nèi)層循環(huán)交換單個元素位置。

2、選擇排序

選擇排序原理:第一次從待排序的數(shù)據(jù)元素中選出最小(或最大)的一個元素,存放在序列的起始位置,然后再從剩余的未排序元素中尋找到最小(大)元素,然后放到已排序的序列的末尾。以此類推,直到全部待排序的數(shù)據(jù)元素的個數(shù)為零。

public class M03_Selection {public static void main(String[] args) {int[] arr = {30,70,50,90,60};selectionSort(arr);}public static void selectionSort (int[] arr){for (int i = 0; i < arr.length - 1; i++) {int minIndex = i;int minData = arr[i];for (int j = i + 1; j < arr.length; j++) {// 假設(shè)最小值判斷if (minData > arr[j]) {// 交換小值minData = arr[j];// 重置 minIndex,遞增minIndex = j;}}// 最小值交換放在arr[0]位置if (minIndex != i) {arr[minIndex] = arr[i];arr[i] = minData ;}System.out.println("第"+(i+1)+"輪排序:"+Arrays.toString(arr));}} }

輸出結(jié)果

第1輪排序:[30, 70, 50, 90, 60] 第2輪排序:[30, 50, 70, 90, 60] 第3輪排序:[30, 50, 60, 90, 70] 第4輪排序:[30, 50, 60, 70, 90]

3、插入排序

基本思想是將一個記錄插入到已經(jīng)排好序的有序表中,排序過程中每次從無序表中取出第一個元素,把它依次與有序表元素進行比較,將它插入到有序表中的適當(dāng)位置,使之成為新的有序表。在實現(xiàn)過程使用雙層循環(huán),外層循環(huán)對除了第一個元素之外的所有元素,內(nèi)層循環(huán)對當(dāng)前元素前面有序表進行待插入位置查找,并進行移動。

public class M04_Insert {public static void main(String[] args) {int[] arr = {10,40,90,20,80};insertSort(arr);}public static void insertSort (int[] arr) {int insertValue = 0;int insertIndex = 0;for (int i = 1; i < arr.length; i++) {// 待插入數(shù)的值和下標(biāo)insertValue = arr[i];insertIndex = i - 1;// 寫入位置while (insertIndex >= 0 && insertValue < arr[insertIndex]) {arr[insertIndex + 1] = arr[insertIndex];insertIndex--;}if (insertIndex + 1 != i) {arr[insertIndex + 1] = insertValue;}System.out.println("第" + i + "輪插入排序:"+Arrays.toString(arr));}} }

輸出結(jié)果

第1輪插入排序:[10, 40, 90, 20, 80] 第2輪插入排序:[10, 40, 90, 20, 80] 第3輪插入排序:[10, 20, 40, 90, 80] 第4輪插入排序:[10, 20, 40, 80, 90]

三、查找算法

查找算法是指在一組元素中尋找一個特定的信息元素,在計算機應(yīng)用中,查找是常用的基本運算,例如編譯程序中符號表的查找;常用的查找算法有:順序查找,二分查找,插值查找,斐波那契查找。

1、順序查找

順序查找是按照序列原有順序?qū)σ唤M元素進行遍歷,并與要查找的元素逐個比較的基本查找算法。

public class M05_OrderFind {public static void main(String[] args) {String[] arr = {"first","second","third"};System.out.println(seqSearch(arr,"second"));}public static int seqSearch(String[] arr, String value) {// 數(shù)組下標(biāo),-1代表沒有int findIndex = -1 ;// 遍歷并逐個對比for (int i = 0; i < arr.length; i++) {if(value.equals(arr[i])) {return i ;}}return findIndex ;} }

2、二分查找

二分查找也稱折半查找(Binary Search),它是一種效率較高的查找方法。但是,折半查找要求線性表必須采用順序存儲結(jié)構(gòu),而且表中元素按關(guān)鍵字有序排列。

public class M06_BinaryFind {public static void main(String[] args) {int arr[] = { 10, 20, 30, 40, 50 };int index = binarySearch (arr, 0, arr.length - 1, 40);System.out.println("index="+index);}public static int binarySearch(int[] arr, int leftIndex, int rightIndex, int findValue) {// leftIndex > rightIndex,沒有查到if (leftIndex > rightIndex) {return -1;}int midIndex = (leftIndex + rightIndex) / 2;int midValue = arr[midIndex];// 向左遞歸if (findValue < midValue) {return binarySearch(arr, leftIndex, midIndex - 1, findValue);// 向右遞歸} else if (findValue > midValue) {return binarySearch(arr, midIndex + 1, rightIndex, findValue);// 直接找到} else {return midIndex;}} }

如果要查詢的元素是沒有順序的,可以基于上述模塊二中的排序算法,先排序再查找。

四、源代碼地址

GitHub·地址 https://github.com/cicadasmile/model-arithmetic-parent GitEE·地址 https://gitee.com/cicadasmile/model-arithmetic-parent

推薦閱讀:編程體系整理

序號項目名稱GitHub地址GitEE地址推薦指數(shù)
01Java描述設(shè)計模式,算法,數(shù)據(jù)結(jié)構(gòu)GitHub·點這里GitEE·點這里☆☆☆☆☆
02Java基礎(chǔ)、并發(fā)、面向?qū)ο蟆eb開發(fā)GitHub·點這里GitEE·點這里☆☆☆☆
03SpringCloud微服務(wù)基礎(chǔ)組件案例詳解GitHub·點這里GitEE·點這里☆☆☆
04SpringCloud微服務(wù)架構(gòu)實戰(zhàn)綜合案例GitHub·點這里GitEE·點這里☆☆☆☆☆
05SpringBoot框架基礎(chǔ)應(yīng)用入門到進階GitHub·點這里GitEE·點這里☆☆☆☆
06SpringBoot框架整合開發(fā)常用中間件GitHub·點這里GitEE·點這里☆☆☆☆☆
07數(shù)據(jù)管理、分布式、架構(gòu)設(shè)計基礎(chǔ)案例GitHub·點這里GitEE·點這里☆☆☆☆☆
08大數(shù)據(jù)系列、存儲、組件、計算等框架GitHub·點這里GitEE·點這里☆☆☆☆☆

總結(jié)

以上是生活随笔為你收集整理的结构与算法(04):排序规则与查找算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。