欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

一文快速掌握J(rèn)ava中的搜索算法和排序算法

 更新時間:2023年04月07日 09:24:50   作者:亮點(diǎn)菌  
這篇文章主要為大家詳細(xì)介紹了Java中常用的搜索算法和排序算法的實(shí)現(xiàn),例如二分查找、冒泡排序、選擇排序等,文中的示例代碼講解詳細(xì),希望對大家有所幫助

一、搜索算法

二分算法

二分算法(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?Web中Ajax技術(shù)使用方法介紹

    Java?Web中Ajax技術(shù)使用方法介紹

    ajax技術(shù)是使頁面能局部刷新的一種技術(shù),下面這篇文章主要給大家介紹了關(guān)于JavaWeb之Ajax的基本使用與實(shí)戰(zhàn)案例的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-10-10
  • Java網(wǎng)絡(luò)編程教程之設(shè)置請求超時的方法

    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ì)過程

    在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)

    詳解Java的MyBatis框架中的緩存與緩存的使用改進(jìn)

    很多人在使用MyBatis的緩存后經(jīng)常會遇到MySQL分頁查詢的顯示問題,針對于此,這里我們就來詳解Java的MyBatis框架中的緩存與緩存的使用改進(jìn),首先來回顧一下MyBatis的緩存機(jī)制與執(zhí)行:
    2016-06-06
  • Spring擴(kuò)展之基于HandlerMapping實(shí)現(xiàn)接口灰度發(fā)布實(shí)例

    Spring擴(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-08
  • SpringBoot掃描不到Controller的解決方案

    SpringBoot掃描不到Controller的解決方案

    這篇文章主要介紹了SpringBoot掃描不到Controller的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • 快速解決idea打開某個項(xiàng)目卡住的問題

    快速解決idea打開某個項(xiàng)目卡住的問題

    這篇文章主要介紹了解決idea打開某個項(xiàng)目卡住的問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08
  • Spring init-method與destroy-method屬性的用法解析

    Spring init-method與destroy-method屬性的用法解析

    這篇文章主要介紹了Spring init-method與destroy-method屬性的用法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Spring基于ProxyFactoryBean創(chuàng)建AOP代理

    Spring基于ProxyFactoryBean創(chuàng)建AOP代理

    這篇文章主要介紹了Spring基于ProxyFactoryBean創(chuàng)建AOP代理,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-10-10
  • ElasticSearch6.2.3+head插件安裝的方法步驟

    ElasticSearch6.2.3+head插件安裝的方法步驟

    這篇文章主要介紹了ElasticSearch6.2.3+head插件安裝的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-02-02

最新評論