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

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

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

快速排序

通過一趟排序將待排元素分成獨立的兩部分,其中一部分為比基準數(shù)小的元素,另一部分則是比基準數(shù)大的元素。然后對這兩部分元素再按照前面的算法進行排序,直到每一部分的元素都只剩下一個。

本質上來看,快速排序應該算是在冒泡排序基礎上的遞歸分治法。

算法原理

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

圖解

問題描述:

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

示例:

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

圖解如下:

Java代碼實現(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ù)組進行分組(左右兩個數(shù)組)
        // i 表示分組之后基準值的索引
        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){
        //確定基準值
        Comparable key = a[l];
        //定義兩個指針
        int left = l;
        int right = h + 1;
        //切分
        while (true){
            //從右向左掃描,移動right指針找一個比基準值小的元素,找到就停止
            while (less(key,a[--right])){
                if (right == l)
                    break;
            }
            //從左向右掃描,移動left指針找一個比基準值大的元素,找到就停止
            while (less(a[++left],key)){
                if (left == h)
                    break;
            }
            if (left>=right){
                break;
            }else {
                swap(a,left,right);
            }
        }
        //交換基準值
        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}

運行結果:

算法分析

時間復雜度

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

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

空間復雜度

空間復雜度主要是遞歸造成的??臻g的使用,最佳情況是,遞歸樹的深度為log2n,此時空間復雜度為O(logn),最壞情況,則需要進行n‐1遞歸調用,此時空間復雜度為 O(n)。

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

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

相關文章

最新評論

芮城县| 图们市| 延长县| 普兰店市| 阳春市| 奉新县| 云梦县| 始兴县| 自治县| 广水市| 乐陵市| 诸城市| 慈溪市| 通州区| 鹤峰县| 柞水县| 鄱阳县| 台湾省| 西宁市| 荣成市| 鹤山市| 西昌市| 潼关县| 枣庄市| 泾源县| 蓬溪县| 双城市| 富裕县| 萝北县| 辽阳县| 黄浦区| 胶州市| 宜州市| 泸定县| 上高县| 潞城市| 余姚市| 石嘴山市| 类乌齐县| 星座| 绥化市|