一文快速掌握J(rèn)ava中的搜索算法和排序算法
一、搜索算法
二分算法
二分算法(Binary Search)又稱折半查找,是一種高效的查找算法。它的基本思想是:將有序數(shù)組(或集合)一分為二,若當(dāng)前中間元素等于目標(biāo)元素,則查找成功;若當(dāng)前中間元素大于目標(biāo)元素,則查找左半部分;若當(dāng)前中間元素小于目標(biāo)元素,則查找右半部分。重復(fù)以上步驟,直到查找到目標(biāo)元素或查找區(qū)間為空,查找失敗。
下面是用Java實(shí)現(xiàn)的二分算法:
public static int binarySearch(int[] arr, int target) { if (arr == null || arr.length == 0) { return -1; } int left = 0; int right = arr.length - 1; while (left <= right) { int mid = left + (right - left) / 2; if (arr[mid] == target) { return mid; } else if (arr[mid] > target) { right = mid - 1; } else { left = mid + 1; } } return -1; }
上述方法使用了一組有序的整數(shù)數(shù)組和一個目標(biāo)值作為參數(shù),返回目標(biāo)值在數(shù)組中的索引;如果目標(biāo)值不存在于數(shù)組中,就返回 -1。
算法的核心是 while 循環(huán),它在 left 和 right 滿足特定條件的情況下反復(fù)執(zhí)行:
- 如果 mid 等于 target,則返回 mid,算法結(jié)束;
- 如果 mid 大于 target,則在左側(cè)繼續(xù)查找,即將 right 設(shè)置為 mid - 1;
- 如果 mid 小于 target,則在右側(cè)繼續(xù)查找,即將 left 設(shè)置為 mid + 1。
每次循環(huán)時,我們使用 mid = left + (right - left) / 2 計(jì)算出中間元素的索引。需要注意的是,我們必須使用 left + right 的形式,而不能使用 (left + right) / 2 的形式,否則可能會導(dǎo)致整數(shù)溢出問題。
二、排序算法
在Java中,排序算法是通過實(shí)現(xiàn)Comparable或Comparator接口來實(shí)現(xiàn)的。以下是幾種常用的排序算法和它們的實(shí)現(xiàn)方法:
冒泡排序
冒泡排序是一種簡單的排序算法。它的思想是不斷地比較相鄰的兩個元素,如果順序不對,就交換位置。這個過程就像水泡不斷往上升一樣,所以叫冒泡排序。
public static void bubbleSort(int[] arr) { int temp; for (int i = 0; i < arr.length - 1; i++) { for (int j = 0; j < arr.length - i - 1; j++) { if (arr[j] > arr[j + 1]) { //交換位置 temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } }
選擇排序
選擇排序的思想是,從未排序的元素中選擇最小的元素放到已排序的末尾。每次找到最小元素后,與當(dāng)前未排序的第一個元素交換位置。
public static void selectionSort(int[] arr) { int minIndex; for (int i = 0; i < arr.length - 1; i++) { minIndex = i; for (int j = i + 1; j < arr.length; j++) { if (arr[j] < arr[minIndex]) { minIndex = j; } } //交換位置 int temp = arr[i]; arr[i] = arr[minIndex]; arr[minIndex] = temp; } }
插入排序
插入排序的思想是,將未排序元素插入到已排序的合適位置。從未排序的元素中選擇一個元素,在已排序的元素中從后往前遍歷,如果比已排序的元素小,則向后移動一個位置,繼續(xù)比較;直到找到比未排序的元素小的位置,然后插入到這個位置。
public static void insertionSort(int[] arr) { int preIndex, current; for (int i = 1; i < arr.length; i++) { preIndex = i - 1; current = arr[i]; while (preIndex >= 0 && arr[preIndex] > current) { arr[preIndex + 1] = arr[preIndex]; preIndex--; } arr[preIndex + 1] = current; } }
快速排序
快速排序是一種基于分治思想的排序算法。它選擇一個基準(zhǔn)點(diǎn),將數(shù)組分成小于等于基準(zhǔn)點(diǎn)和大于基準(zhǔn)點(diǎn)的兩個子數(shù)組,然后遞歸地對兩個子數(shù)組排序。
public static void quickSort(int[] arr, int left, int right) { if (left < right) { int i = left, j = right, pivot = arr[left]; while (i < j) { while (i < j && arr[j] >= pivot) { j--; } if (i < j) { arr[i++] = arr[j]; } while (i < j && arr[i] <= pivot) { i++; } if (i < j) { arr[j--] = arr[i]; } } arr[i] = pivot; quickSort(arr, left, i - 1); quickSort(arr, i + 1, right); } }
對于學(xué)習(xí)編程或者準(zhǔn)備進(jìn)入編程行業(yè)的人來說,掌握算法是一個必要的技能。而在Java編程中,掌握常見的排序算法和二分查找是非常關(guān)鍵的。排序算法可以幫助我們對數(shù)據(jù)進(jìn)行快速排序,提高程序的效率;而二分查找則可以快速找到我們需要的數(shù)據(jù),降低程序的時間復(fù)雜度。
如果你剛剛?cè)腴TJava編程或者想要提高編程實(shí)力,建議先掌握一些基礎(chǔ)的排序算法,比如插入排序、選擇排序和冒泡排序,并且在學(xué)習(xí)的過程中積極動手實(shí)踐。
在掌握排序算法的基礎(chǔ)上,再深入學(xué)習(xí)二分查找算法。這是一種高效的查找方法,可以大幅度縮短查找時間,尤其是在需要查找大量數(shù)據(jù)的情況下。在實(shí)踐中,可以使用二分查找算法來查找數(shù)組中的數(shù)據(jù)、棋盤游戲中的最優(yōu)解等等。
總之,掌握常見的排序算法和二分查找算法,對于Java編程實(shí)力的提高和職業(yè)發(fā)展都是非常有幫助的。希望大家可以在學(xué)習(xí)的過程中保持好奇心和熱情,不斷挑戰(zhàn)自己,提高編程能力。
到此這篇關(guān)于一文快速掌握J(rèn)ava中的搜索算法和排序算法的文章就介紹到這了,更多相關(guān)Java算法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java網(wǎng)絡(luò)編程教程之設(shè)置請求超時的方法
這篇文章主要給大家介紹了關(guān)于Java網(wǎng)絡(luò)編程教程之設(shè)置請求超時的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-12-12在VSCode里使用Jupyter?Notebook調(diào)試Java代碼的詳細(xì)過程
Jupyter Notebook是以網(wǎng)頁的形式打開,可以在網(wǎng)頁頁面中直接編寫代碼和運(yùn)行代碼,代碼的運(yùn)行結(jié)果也會直接在代碼塊下顯示的程序,這篇文章主要介紹了在VSCode里使用Jupyter?Notebook,調(diào)試Java代碼,需要的朋友可以參考下2022-07-07詳解Java的MyBatis框架中的緩存與緩存的使用改進(jìn)
很多人在使用MyBatis的緩存后經(jīng)常會遇到MySQL分頁查詢的顯示問題,針對于此,這里我們就來詳解Java的MyBatis框架中的緩存與緩存的使用改進(jìn),首先來回顧一下MyBatis的緩存機(jī)制與執(zhí)行:2016-06-06Spring擴(kuò)展之基于HandlerMapping實(shí)現(xiàn)接口灰度發(fā)布實(shí)例
這篇文章主要介紹了Spring擴(kuò)展之基于HandlerMapping實(shí)現(xiàn)接口灰度發(fā)布實(shí)例,灰度發(fā)布是指在黑與白之間,能夠平滑過渡的一種發(fā)布方式,灰度發(fā)布可以保證整體系統(tǒng)的穩(wěn)定,在初始灰度的時候就可以發(fā)現(xiàn)、調(diào)整問題,以保證其影響度,需要的朋友可以參考下2023-08-08Spring init-method與destroy-method屬性的用法解析
這篇文章主要介紹了Spring init-method與destroy-method屬性的用法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08Spring基于ProxyFactoryBean創(chuàng)建AOP代理
這篇文章主要介紹了Spring基于ProxyFactoryBean創(chuàng)建AOP代理,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-10-10ElasticSearch6.2.3+head插件安裝的方法步驟
這篇文章主要介紹了ElasticSearch6.2.3+head插件安裝的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-02-02