最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

快速排序

通過一趟排序?qū)⒋旁胤殖瑟?dú)立的兩部分,其中一部分為比基準(zhǔn)數(shù)小的元素,另一部分則是比基準(zhǔn)數(shù)大的元素。然后對這兩部分元素再按照前面的算法進(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;
        //對數(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){
            //從右向左掃描,移動right指針找一個(gè)比基準(zhǔn)值小的元素,找到就停止
            while (less(key,a[--right])){
                if (right == l)
                    break;
            }
            //從左向右掃描,移動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ù)雜度主要是遞歸造成的??臻g的使用,最佳情況是,遞歸樹的深度為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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論

天长市| 申扎县| 民乐县| 冕宁县| 龙门县| 张家口市| 股票| 大埔区| 台前县| 夏津县| 海阳市| 磐安县| 宜州市| 临高县| 马龙县| 咸阳市| 甘洛县| 博白县| 辽阳市| 吴江市| 彭泽县| 泾源县| 定西市| 长丰县| 克什克腾旗| 科技| 札达县| 华宁县| 大安市| 故城县| 盐亭县| 龙口市| 洱源县| 桐乡市| 青河县| 长葛市| 景东| 竹山县| 白银市| 广汉市| 北辰区|