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

圖解Java排序算法之3種簡(jiǎn)單排序

 更新時(shí)間:2021年11月04日 17:08:20   作者:dreamcatcher-cx  
這篇文章主要為大家詳細(xì)介紹了Java排序算法之3種簡(jiǎn)單排序,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

排序是數(shù)據(jù)處理中十分常見(jiàn)且核心的操作,雖說(shuō)實(shí)際項(xiàng)目開(kāi)發(fā)中很小幾率會(huì)需要我們手動(dòng)實(shí)現(xiàn),畢竟每種語(yǔ)言的類(lèi)庫(kù)中都有n多種關(guān)于排序算法的實(shí)現(xiàn)。但是了解這些精妙的思想對(duì)我們還是大有裨益的。本文簡(jiǎn)單溫習(xí)下最基礎(chǔ)的三類(lèi)算法:選擇,冒泡,插入。

先定義個(gè)交換數(shù)組元素的函數(shù),供排序時(shí)調(diào)用

/**
     * 交換數(shù)組元素
     * @param arr
     * @param a
     * @param b
     */
    public static void swap(int []arr,int a,int b){
        arr[a] = arr[a]+arr[b];
        arr[b] = arr[a]-arr[b];
        arr[a] = arr[a]-arr[b];
    }

簡(jiǎn)單選擇排序

簡(jiǎn)單選擇排序是最簡(jiǎn)單直觀的一種算法,基本思想為每一趟從待排序的數(shù)據(jù)元素中選擇最?。ɑ蜃畲螅┑囊粋€(gè)元素作為首元素,直到所有元素排完為止,簡(jiǎn)單選擇排序是不穩(wěn)定排序。

在算法實(shí)現(xiàn)時(shí),每一趟確定最小元素的時(shí)候會(huì)通過(guò)不斷地比較交換來(lái)使得首位置為當(dāng)前最小,交換是個(gè)比較耗時(shí)的操作。其實(shí)我們很容易發(fā)現(xiàn),在還未完全確定當(dāng)前最小元素之前,這些交換都是無(wú)意義的。我們可以通過(guò)設(shè)置一個(gè)變量min,每一次比較僅存儲(chǔ)較小元素的數(shù)組下標(biāo),當(dāng)輪循環(huán)結(jié)束之后,那這個(gè)變量存儲(chǔ)的就是當(dāng)前最小元素的下標(biāo),此時(shí)再執(zhí)行交換操作即可。代碼實(shí)現(xiàn)很簡(jiǎn)單,一起來(lái)看下。

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

/**
     * 簡(jiǎn)單選擇排序
     *
     * @param arr
     */
    public static void selectSort(int[] arr) {
        for (int i = 0; i < arr.length - 1; i++) {
            int min = i;//每一趟循環(huán)比較時(shí),min用于存放較小元素的數(shù)組下標(biāo),這樣當(dāng)前批次比較完畢最終存放的就是此趟內(nèi)最小的元素的下標(biāo),避免每次遇到較小元素都要進(jìn)行交換。
            for (int j = i + 1; j < arr.length; j++) {
                if (arr[j] < arr[min]) {
                    min = j;
                }
            }
            //進(jìn)行交換,如果min發(fā)生變化,則進(jìn)行交換
            if (min != i) {
                swap(arr,min,i);
            }
        }
    }

簡(jiǎn)單選擇排序通過(guò)上面優(yōu)化之后,無(wú)論數(shù)組原始排列如何,比較次數(shù)是不變的;對(duì)于交換操作,在最好情況下也就是數(shù)組完全有序的時(shí)候,無(wú)需任何交換移動(dòng),在最差情況下,也就是數(shù)組倒序的時(shí)候,交換次數(shù)為n-1次。綜合下來(lái),時(shí)間復(fù)雜度為O(n2)

冒泡排序

冒泡排序的基本思想是,對(duì)相鄰的元素進(jìn)行兩兩比較,順序相反則進(jìn)行交換,這樣,每一趟會(huì)將最小或最大的元素“浮”到頂端,最終達(dá)到完全有序

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

在冒泡排序的過(guò)程中,如果某一趟執(zhí)行完畢,沒(méi)有做任何一次交換操作,比如數(shù)組[5,4,1,2,3],執(zhí)行了兩次冒泡,也就是兩次外循環(huán)之后,分別將5和4調(diào)整到最終位置[1,2,3,4,5]。此時(shí),再執(zhí)行第三次循環(huán)后,一次交換都沒(méi)有做,這就說(shuō)明剩下的序列已經(jīng)是有序的,排序操作也就可以完成了,來(lái)看下代碼 

/**
     * 冒泡排序
     *
     * @param arr
     */
    public static void bubbleSort(int[] arr) {
        for (int i = 0; i < arr.length - 1; i++) {
            boolean flag = true;//設(shè)定一個(gè)標(biāo)記,若為true,則表示此次循環(huán)沒(méi)有進(jìn)行交換,也就是待排序列已經(jīng)有序,排序已然完成。
            for (int j = 0; j < arr.length - 1 - i; j++) {
                if (arr[j] > arr[j + 1]) {
                    swap(arr,j,j+1);
                    flag = false;
                }
            }
            if (flag) {
                break;
            }
        }
    }

根據(jù)上面這種冒泡實(shí)現(xiàn),若原數(shù)組本身就是有序的(這是最好情況),僅需n-1次比較就可完成;若是倒序,比較次數(shù)為 n-1+n-2+...+1=n(n-1)/2,交換次數(shù)和比較次數(shù)等值。所以,其時(shí)間復(fù)雜度依然為O(n2)。綜合來(lái)看,冒泡排序性能還還是稍差于上面那種選擇排序的。

直接插入排序

直接插入排序基本思想是每一步將一個(gè)待排序的記錄,插入到前面已經(jīng)排好序的有序序列中去,直到插完所有元素為止。

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

/**
     * 插入排序
     *
     * @param arr
     */
    public static void insertionSort(int[] arr) {
        for (int i = 1; i < arr.length; i++) {
            int j = i;
            while (j > 0 && arr[j] < arr[j - 1]) {
                swap(arr,j,j-1);
                j--;
            }
        }
    }

簡(jiǎn)單插入排序在最好情況下,需要比較n-1次,無(wú)需交換元素,時(shí)間復(fù)雜度為O(n);在最壞情況下,時(shí)間復(fù)雜度依然為O(n2)。但是在數(shù)組元素隨機(jī)排列的情況下,插入排序還是要優(yōu)于上面兩種排序的。

總結(jié)

本文列舉了排序算法中最基本的三種算法(簡(jiǎn)單選擇,冒泡,插入),這三種排序算法的時(shí)間復(fù)雜度均為O(n2),后續(xù)會(huì)陸續(xù)更新其他更高階一些的排序算法,時(shí)間復(fù)雜度也會(huì)逐步突破O(n2),謝謝支持。

本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • Java中泛型使用的簡(jiǎn)單方法介紹

    Java中泛型使用的簡(jiǎn)單方法介紹

    這篇文章主要給大家介紹了關(guān)于Java中泛型使用的簡(jiǎn)單方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • IDEA+Maven搭建Spring環(huán)境的詳細(xì)教程

    IDEA+Maven搭建Spring環(huán)境的詳細(xì)教程

    這篇文章主要介紹了IDEA+Maven搭建Spring環(huán)境的詳細(xì)教程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • 基于java時(shí)區(qū)轉(zhuǎn)換夏令時(shí)的問(wèn)題及解決方法

    基于java時(shí)區(qū)轉(zhuǎn)換夏令時(shí)的問(wèn)題及解決方法

    下面小編就為大家分享一篇基于java時(shí)區(qū)轉(zhuǎn)換夏令時(shí)的問(wèn)題及解決方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2017-11-11
  • java圖形驗(yàn)證碼生成工具類(lèi) web頁(yè)面校驗(yàn)驗(yàn)證碼

    java圖形驗(yàn)證碼生成工具類(lèi) web頁(yè)面校驗(yàn)驗(yàn)證碼

    這篇文章主要為大家詳細(xì)介紹了java圖形驗(yàn)證碼生成工具類(lèi),web頁(yè)面校驗(yàn)驗(yàn)證碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • Java枚舉類(lèi)使用場(chǎng)景及實(shí)例解析

    Java枚舉類(lèi)使用場(chǎng)景及實(shí)例解析

    這篇文章主要介紹了Java枚舉類(lèi)使用場(chǎng)景及實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • Java中ResultSetMetaData 元數(shù)據(jù)的具體使用

    Java中ResultSetMetaData 元數(shù)據(jù)的具體使用

    本文主要介紹了Java中ResultSetMetaData 元數(shù)據(jù)的具體使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • JAVA十大排序算法之堆排序詳解

    JAVA十大排序算法之堆排序詳解

    這篇文章主要介紹了java中的冒泡排序,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考
    2021-08-08
  • hibernate一對(duì)多關(guān)聯(lián)映射學(xué)習(xí)小結(jié)

    hibernate一對(duì)多關(guān)聯(lián)映射學(xué)習(xí)小結(jié)

    這篇文章主要介紹了hibernate一對(duì)多關(guān)聯(lián)映射學(xué)習(xí)小結(jié),需要的朋友可以參考下
    2017-09-09
  • JVM GC 垃圾收集梳理總結(jié)

    JVM GC 垃圾收集梳理總結(jié)

    這篇文章主要介紹了JVM GC 垃圾收集梳理總結(jié),GC是一種自動(dòng)的存儲(chǔ)管理機(jī)制。當(dāng)一些被占用的內(nèi)存不再需要時(shí),就應(yīng)該予以釋放,這種存儲(chǔ)資源管理,稱(chēng)為垃圾回收
    2022-07-07
  • Java中i++與++i的區(qū)別和使用

    Java中i++與++i的區(qū)別和使用

    這篇文章主要介紹了Java中i++與++i的區(qū)別和使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02

最新評(píng)論