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

Java 數(shù)據(jù)結(jié)構(gòu)與算法系列精講之排序算法

 更新時(shí)間:2022年02月17日 16:52:37   作者:我是小白呀  
排序算法是《數(shù)據(jù)結(jié)構(gòu)與算法》中最基本的算法之一。排序算法可以分為內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部的排序記錄,在排序過程中需要訪問外存

概述

從今天開始, 小白我將帶大家開啟 Java 數(shù)據(jù)結(jié)構(gòu) & 算法的新篇章.

冒泡排序

冒泡排序 (Bubble Sort) 是一種簡(jiǎn)單的排序算法. 它重復(fù)地遍歷要排序的數(shù)列, 一次比較兩個(gè)元素, 如果他們的順序錯(cuò)誤就把他們交換過來. 遍歷數(shù)列的工作是重復(fù)地進(jìn)行直到?jīng)]有再需要交換, 也就是說該數(shù)列已經(jīng)排序完成. 這個(gè)算法的名字由來是因?yàn)樵叫〉脑貢?huì)經(jīng)由交換慢慢 “浮” 到數(shù)列的頂端.

冒泡排序流程:

  • 通過比較相鄰的元素, 判斷兩個(gè)元素位置是否需要互換
  • 進(jìn)行 n-1 次比較, 結(jié)尾的元素就會(huì)是最大元素
  • 重復(fù)以上冒泡過程 n 次

代碼實(shí)現(xiàn):

import java.util.Arrays;

public class bubble {

    public static void main(String[] args) {

        // 創(chuàng)建數(shù)據(jù)
        int[] array = {426,375474,8465,453};

        // 實(shí)現(xiàn)排序
        System.out.println(Arrays.toString(array));
        System.out.println(Arrays.toString(bubbleSort(array)));
    }

    public static int[] bubbleSort(int[] array) {
        // 如果數(shù)組為空, 返回
        if (array.length == 0){
            return array;
        }

        // 執(zhí)行冒泡過程n次, n為數(shù)組長(zhǎng)度
        for (int i = 0; i < array.length; i++) {

            // 冒泡過程
            for (int j = 0; j < array.length - 1 - i; j++) {

                // 判斷j索引的元素是否比j+1索引的元素大
                if (array[j+1] < array[j]) {
                    // 交換位置
                    int temp = array[j + 1];
                    array[j + 1] = array[j];
                    array[j] = temp;
                }
            }
        }
        return array;
    }
}

輸出結(jié)果:

[426, 375474, 8465, 453]
[426, 453, 8465, 375474]

插入排序

插入排序 (Insertion Sort) 是一種簡(jiǎn)單直觀的排序算法. 它的工作原理是通過構(gòu)建有序序列, 對(duì)于未排序數(shù)據(jù), 在已排序序列中從后向前掃描,找到相應(yīng)位置并插入. 插入排序在實(shí)現(xiàn)上, 在從后向前掃描過程中, 需要反復(fù)把已排序元素逐步向后挪位, 為最新元素提供插入空間.

插入排序流程:

  • 從第二個(gè)元素開始, 從后往前掃描
  • 逐個(gè)比較元素大小, 之道插入到合適的位置
  • 重復(fù)以上步驟 n-1 次

代碼實(shí)現(xiàn):

import java.util.Arrays;

public class insert {

    public static void main(String[] args) {

        // 創(chuàng)建數(shù)據(jù)
        int[] array = {426,375474,8465,453};

        // 實(shí)現(xiàn)排序
        System.out.println(Arrays.toString(array));
        System.out.println(Arrays.toString(insertionSort(array)));
    }

    public static int[] insertionSort(int[] array) {

        // 如果數(shù)組為空, 返回
        if (array.length == 0)
            return array;

        // 待排序元素
        int current;

        // 執(zhí)行插入過程n-1次
        for (int i = 0; i < array.length - 1; i++) {

            // 指定待排序元素
            current = array[i + 1];

            int preIndex = i;

            // 執(zhí)行插入過程, 往前一個(gè)個(gè)比對(duì)
            while (preIndex >= 0 && current < array[preIndex]) {
                array[preIndex + 1] = array[preIndex];
                preIndex--;
            }

            // 插入元素
            array[preIndex + 1] = current;
        }
        return array;
    }
}

輸出結(jié)果:

???[426, 375474, 8465, 453]
[426, 453, 8465, 375474]

歸并排序

歸并排序 (Merge Sort) 是一種建立在歸并操作上的算法, 是分治的一個(gè)經(jīng)典應(yīng)用.

歸并排序流程:

  • 把數(shù)組拆分成兩個(gè) n/2 長(zhǎng)度的子序列
  • 對(duì)這兩個(gè)子序列分別采用歸并排序
  • 將排序好的序列合并成最終序列

代碼實(shí)現(xiàn):

import java.util.Arrays;

public class merge {

    public static void main(String[] args) {

        // 創(chuàng)建數(shù)據(jù)
        int[] array = {426,375474,8465,453};

        // 實(shí)現(xiàn)排序
        System.out.println(Arrays.toString(array));
        System.out.println(Arrays.toString(mergeSort(array)));
    }

    public static int[] mergeSort(int[] array) {

        // 如果數(shù)組長(zhǎng)度小于2, 返回
        if (array.length < 2) {
            return array;
        }
        
        // 分治
        int mid = array.length / 2;
        int[] left = Arrays.copyOfRange(array, 0, mid);
        int[] right = Arrays.copyOfRange(array, mid, array.length);
        return merge(mergeSort(left), mergeSort(right));
    }

    public static int[] merge(int[] left, int[] right) {

        // 創(chuàng)建數(shù)組用于存放合并后的序列
        int[] result = new int[left.length + right.length];


        for (int index = 0, i = 0, j = 0; index < result.length; index++) {
            // 左序列取完
            if (i >= left.length)
                result[index] = right[j++];
            // 右序列取完
            else if (j >= right.length)
                result[index] = left[i++];
            // 左序列的第i個(gè)大于有序列的第j個(gè)
            else if (left[i] > right[j])
                result[index] = right[j++];
            else
                result[index] = left[i++];
        }
        return result;
    }
}

輸出結(jié)果:

[426, 375474, 8465, 453]
[426, 453, 8465, 375474]

快速排序

快速排序 (Quicksort) 通過一趟排序?qū)⒁判虻臄?shù)據(jù)分割成獨(dú)立的兩部分, 其中一部分的所有數(shù)據(jù)都比另外一部分的所有數(shù)據(jù)都要小, 然后再按此方法對(duì)這兩部分?jǐn)?shù)據(jù)分別進(jìn)行快速排序, 整個(gè)排序過程可以遞歸進(jìn)行, 以此達(dá)到整個(gè)數(shù)據(jù)變成有序序列.

??

快速排序流程:

  • 從數(shù)組中挑出一個(gè)元素作為基準(zhǔn) (Pivot), 通常為第一個(gè)或者最后一個(gè)元素將比基準(zhǔn)元素
  • 小的值放到基準(zhǔn)前面, 比基準(zhǔn)元素大的值放到基準(zhǔn)后面
  • 遞歸進(jìn)行分區(qū)操作

代碼實(shí)現(xiàn):

import java.util.Arrays;

public class quick {

    public static void main(String[] args) {

        // 創(chuàng)建數(shù)據(jù)
        int[] array = {426, 375474, 8465, 453};

        // 實(shí)現(xiàn)排序
        System.out.println(Arrays.toString(array));
        quickSort(array, 0, array.length - 1);
        System.out.println(Arrays.toString(array));
    }


    public static void quickSort(int[] arr, int low, int high) {

        // 定義
        int p, i, j, temp;

        if (low >= high) {
            return;
        }
        
        // p就是基準(zhǔn)數(shù), 每個(gè)數(shù)組的第一個(gè)
        p = arr[low];
        i = low;
        j = high;

        while (i < j) {
            //右邊當(dāng)發(fā)現(xiàn)小于p的值時(shí)停止循環(huán)
            while (arr[j] >= p && i < j) {
                j--;
            }

            //這里一定是右邊開始,上下這兩個(gè)循環(huán)不能調(diào)換(下面有解析,可以先想想)

            //左邊當(dāng)發(fā)現(xiàn)大于p的值時(shí)停止循環(huán)
            while (arr[i] <= p && i < j) {
                i++;
            }

            temp = arr[j];
            arr[j] = arr[i];
            arr[i] = temp;
        }

        // 交換p和arr[i]
        arr[low] = arr[i];
        arr[i] = p;

        // 分別進(jìn)行快排
        quickSort(arr, low, j - 1);
        quickSort(arr, j + 1, high);
    }
}

輸出結(jié)果:

[426, 375474, 8465, 453]
[426, 453, 8465, 375474]

總結(jié)

算法 時(shí)間復(fù)雜度 穩(wěn)定性 適用場(chǎng)景
冒泡排序 O ( n 2 ) O(n^2) O(n2) 穩(wěn)定 數(shù)組大致為從小到大
插入排序 O ( n 2 ) O(n^2) O(n2) 穩(wěn)定 適用于數(shù)組較小的場(chǎng)景
歸并排序 O ( n l o g n ) O(nlogn) O(nlogn) 穩(wěn)定 適用于數(shù)組較大的場(chǎng)景
快速排序 O ( n l o g n ) O(nlogn) O(nlogn) 不穩(wěn)定 適用于數(shù)組較大的場(chǎng)景

到此這篇關(guān)于Java 數(shù)據(jù)結(jié)構(gòu)與算法系列精講之排序算法的文章就介紹到這了,更多相關(guān)Java 排序算法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Redis中的事務(wù)和Redis樂觀鎖詳解

    Redis中的事務(wù)和Redis樂觀鎖詳解

    這篇文章主要介紹了Redis中的事務(wù)和Redis樂觀鎖詳解,Redis事務(wù)是一個(gè)單獨(dú)的隔離操作:事務(wù)中的所有命令都會(huì)序列化、按順序地執(zhí)行,事務(wù)在執(zhí)行的過程中,不會(huì)被其他客戶端發(fā)送來的命令請(qǐng)求所打斷,需要的朋友可以參考下
    2023-12-12
  • Spring讀取配置文件屬性實(shí)現(xiàn)方法

    Spring讀取配置文件屬性實(shí)現(xiàn)方法

    這篇文章主要介紹了Spring讀取配置文件屬性實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • Java數(shù)據(jù)結(jié)構(gòu)及算法實(shí)例:考拉茲猜想 Collatz Conjecture

    Java數(shù)據(jù)結(jié)構(gòu)及算法實(shí)例:考拉茲猜想 Collatz Conjecture

    這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)及算法實(shí)例:考拉茲猜想 Collatz Conjecture,本文直接給出實(shí)現(xiàn)代碼,代碼中包含詳細(xì)注釋,需要的朋友可以參考下
    2015-06-06
  • Spring boot validation校驗(yàn)方法實(shí)例

    Spring boot validation校驗(yàn)方法實(shí)例

    這篇文章主要給大家介紹了關(guān)于Spring boot validation校驗(yàn)方法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • Java中八種基本數(shù)據(jù)類型的默認(rèn)值

    Java中八種基本數(shù)據(jù)類型的默認(rèn)值

    這篇文章主要介紹了Java中八種基本數(shù)據(jù)類型的默認(rèn)值 的相關(guān)資料,需要的朋友可以參考下
    2016-07-07
  • Java中IO流解析及代碼實(shí)例詳解

    Java中IO流解析及代碼實(shí)例詳解

    流是一種抽象概念,它代表了數(shù)據(jù)的無結(jié)構(gòu)化傳遞。。用來進(jìn)行輸入輸出操作的流就稱為IO流。換句話說,IO流就是以流的方式進(jìn)行輸入輸出
    2021-08-08
  • 2021年最新Redis面試題匯總(1)

    2021年最新Redis面試題匯總(1)

    在程序員面試過程中redis相關(guān)的知識(shí)是常被問到的話題。這篇文章主要介紹了幾道Redis面試題,整理一下分享給大家,感興趣的小伙伴們可以參考一下
    2021-07-07
  • 消息隊(duì)列 RabbitMQ 與 Spring 整合使用的實(shí)例代碼

    消息隊(duì)列 RabbitMQ 與 Spring 整合使用的實(shí)例代碼

    本篇文章主要介紹了消息隊(duì)列 RabbitMQ 與 Spring 整合使用的實(shí)例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • Java模擬微信來電提醒示例

    Java模擬微信來電提醒示例

    這篇文章主要為大家介紹了Java模擬微信來電提醒示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • java讀寫ini文件、FileOutputStream問題

    java讀寫ini文件、FileOutputStream問題

    這篇文章主要介紹了java讀寫ini文件、FileOutputStream問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04

最新評(píng)論