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

圖解Java經(jīng)典算法快速排序的原理與實(shí)現(xiàn)

 更新時(shí)間:2022年09月09日 15:59:36   作者:Binaire-沐辰  
快速排序是基于二分的思想,對(duì)冒泡排序的一種改進(jìn)。主要思想是確立一個(gè)基數(shù),將小于基數(shù)的數(shù)放到基數(shù)左邊,大于基數(shù)的數(shù)字放到基數(shù)的右邊,然后在對(duì)這兩部分進(jìn)一步排序,從而實(shí)現(xiàn)對(duì)數(shù)組的排序

快速排序

通過一趟排序?qū)⒋旁胤殖瑟?dú)立的兩部分,其中一部分為比基準(zhǔn)數(shù)小的元素,另一部分則是比基準(zhǔn)數(shù)大的元素。然后對(duì)這兩部分元素再按照前面的算法進(jìn)行排序,直到每一部分的元素都只剩下一個(gè)。

本質(zhì)上來看,快速排序應(yīng)該算是在冒泡排序基礎(chǔ)上的遞歸分治法。

算法原理

  • 從數(shù)列中挑出一個(gè)元素作為基準(zhǔn)點(diǎn)
  • 重新排序數(shù)列,所有元素比基準(zhǔn)值小的擺放在基準(zhǔn)前面,所有元素比基準(zhǔn)值大的擺在基準(zhǔn)的后面
  • 然后基準(zhǔn)值左右兩邊,重復(fù)上述步驟
  • 通過遞歸把基準(zhǔn)值元素左右兩側(cè)的數(shù)組排序,排完之后,整個(gè)數(shù)組就排序完成了

圖解

問題描述:

給定一個(gè)無序排列的數(shù)組 nums,使其能夠按照有序輸出

示例:

輸入: nums = [4,3,1,2,9,6],
輸出: nums = [1,2,3,4,6,9]

圖解如下:

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

核心代碼

public class QuickSort {
    //比較 v 是否小于 w
    public static boolean less(Comparable v,Comparable w){
        return v.compareTo(w) < 0;
    }
    //數(shù)組元素交換位置
    private static void swap(Comparable[] a,int i,int j){
        Comparable temp;
        temp = a[i];
        a[i] = a[j];
        a[j] = temp;
    }
    //排序
    public static void sort(Comparable[] a){
        int l = 0;
        int h = a.length - 1;
        sort(a,l,h);
    }
    private static void sort(Comparable[] a,int l,int h){
        if (h <= l)  return;
        //對(duì)數(shù)組進(jìn)行分組(左右兩個(gè)數(shù)組)
        // i 表示分組之后基準(zhǔn)值的索引
        int i = partition(a, l, h);
        //讓左邊的數(shù)組有序
        sort(a,l,i - 1);
        //讓有邊的數(shù)組有序
        sort(a,i + 1,h);
    }
    public static int partition(Comparable[] a,int l,int h){
        //確定基準(zhǔn)值
        Comparable key = a[l];
        //定義兩個(gè)指針
        int left = l;
        int right = h + 1;
        //切分
        while (true){
            //從右向左掃描,移動(dòng)right指針找一個(gè)比基準(zhǔn)值小的元素,找到就停止
            while (less(key,a[--right])){
                if (right == l)
                    break;
            }
            //從左向右掃描,移動(dòng)left指針找一個(gè)比基準(zhǔn)值大的元素,找到就停止
            while (less(a[++left],key)){
                if (left == h)
                    break;
            }
            if (left>=right){
                break;
            }else {
                swap(a,left,right);
            }
        }
        //交換基準(zhǔn)值
        swap(a,l,right);
        return right;
    }
}
public class QuickSortTest {
    public static void main(String[] args) {
        Integer[] arr = {3,1,2,4,9,6};
        QuickSort.sort(arr);
        System.out.println(Arrays.toString(arr));
    }
}
//排序前:{3,1,2,4,9,6}
//排序后:{1,2,3,4,6,9}

運(yùn)行結(jié)果:

算法分析

時(shí)間復(fù)雜度

快速排序的最佳情況就是每一次取到的元素都剛好平分整個(gè)數(shù)組,由于快速排序用到了遞歸調(diào)用,因此計(jì)算其時(shí)間復(fù)雜度也需要用到遞歸算法來計(jì)算。T[n] = 2T[n/2] + f(n);此時(shí)時(shí)間復(fù)雜度是O(nlogn)。最壞的情況,則和冒泡排序一樣,每次比較都需要交換元素,此時(shí)時(shí)間復(fù)雜度是O(n^2)。

因此,快速排序的時(shí)間復(fù)雜度為:O(nlogn)。

空間復(fù)雜度

空間復(fù)雜度主要是遞歸造成的棧空間的使用,最佳情況是,遞歸樹的深度為log2n,此時(shí)空間復(fù)雜度為O(logn),最壞情況,則需要進(jìn)行n‐1遞歸調(diào)用,此時(shí)空間復(fù)雜度為 O(n)。

因此,快速排序的空間復(fù)雜度為: O(logn)。

到此這篇關(guān)于圖解Java經(jīng)典算法快速排序的原理與實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Java快速排序內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java實(shí)現(xiàn)上傳文件到oss(阿里云)功能示例

    java實(shí)現(xiàn)上傳文件到oss(阿里云)功能示例

    這篇文章主要介紹了java實(shí)現(xiàn)上傳文件到oss(阿里云)功能,結(jié)合實(shí)例形式詳細(xì)分析了java上傳文件到阿里云的具體步驟、配置及相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2019-11-11
  • 詳解Java編程規(guī)約(命名風(fēng)格、常量定義、代碼格式)

    詳解Java編程規(guī)約(命名風(fēng)格、常量定義、代碼格式)

    這篇文章主要介紹了詳解Java編程規(guī)約(命名風(fēng)格、常量定義、代碼格式),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-10-10
  • Java的Character類詳解

    Java的Character類詳解

    在實(shí)際開發(fā)過程中,我們經(jīng)常會(huì)遇到需要使用對(duì)象,而不是內(nèi)置數(shù)據(jù)類型的情況。為了解決這個(gè)問題,Java語言為內(nèi)置數(shù)據(jù)類型char提供了包裝類Character類。本文詳細(xì)介紹了Java的Character類,感興趣的同學(xué)可以參考閱讀
    2023-04-04
  • java編程創(chuàng)建型設(shè)計(jì)模式單例模式的七種示例

    java編程創(chuàng)建型設(shè)計(jì)模式單例模式的七種示例

    這篇文章主要為大家介紹了java編程中創(chuàng)建型設(shè)計(jì)模式之單例模式的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2022-02-02
  • 解決Eclipse的Servers視圖中無法添加Tomcat6/Tomcat7的方法

    解決Eclipse的Servers視圖中無法添加Tomcat6/Tomcat7的方法

    這篇文章主要介紹了解決Eclipse的Servers視圖中無法添加Tomcat6/Tomcat7的方法的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • 詳解Java程序讀取properties配置文件的方法

    詳解Java程序讀取properties配置文件的方法

    這篇文章主要介紹了Java讀取properties配置文件的方法講解,properties可以被看作是Java世界的ini,Java中有Properties可以操作它,需要的朋友可以參考下
    2016-04-04
  • java書店系統(tǒng)畢業(yè)設(shè)計(jì) 用戶模塊(3)

    java書店系統(tǒng)畢業(yè)設(shè)計(jì) 用戶模塊(3)

    這篇文章主要介紹了java書店系統(tǒng)畢業(yè)設(shè)計(jì),第三步系統(tǒng)總體設(shè)計(jì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • SpringBoot 實(shí)戰(zhàn) 之 優(yōu)雅終止服務(wù)的方法

    SpringBoot 實(shí)戰(zhàn) 之 優(yōu)雅終止服務(wù)的方法

    本篇文章主要介紹了SpringBoot 實(shí)戰(zhàn) 之 優(yōu)雅終止服務(wù)的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-05-05
  • JavaWeb通過IDEA配置Servlet操作流程詳解

    JavaWeb通過IDEA配置Servlet操作流程詳解

    這篇文章主要介紹了JavaWeb通過IDEA配置Servlet實(shí)現(xiàn)流程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2022-10-10
  • Spring高級(jí)接口Aware淺析

    Spring高級(jí)接口Aware淺析

    通過aware接口可以獲取Spring容器相關(guān)信息,但這樣會(huì)與Spring容器耦合,這篇文章主要介紹了Spring aware接口理解,需要的朋友可以參考下
    2023-01-01

最新評(píng)論