快速排序

時間複雜度的簡介算法

算法的時間複雜度是一個函數,描述了算法的執行時間。一般使用大O符號來表示。
在進行算法分析時,語句總的執行次數T(n)是關於問題規模n的函數,進而分析T(n)隨n的變
狀況來肯定T(n)的數量級。

通常狀況下,算法中基本操做重複執行的次數是問題規模n的某個函數,O(f(n))
分析:隨着n的增加,算法執行的時間的增加率和 f(n) 的增加率成正比,
因此 f(n) 越小,算法的時間複雜度越低,算法的效率越高。

常見的時間複雜度分析
有幾重for循環,只有一重則時間複雜度爲O(n),二重則爲O(n^2)依此類推
若是有二分則爲O(logn),二分例如二分查找,若是一個for循環套一個二分,
那麼時間複雜度則爲O(nlogn)

常見的時間複雜度
常數階O(1),對數階O(  ),線性階O(n),
線性對數階O(nlog2n),平方階O(n^2),立方階O(n^3),...,
k次方階O(n^k),指數階O(2^n)
隨着問題規模n的不斷增大,上述時間複雜度不斷增大,算法的執行效率越低。

快速排序數組

快速排序的分析

圖片描述

快速排序的流程

圖片描述

快速排序的代碼實現函數

public static void main(String[] args) {
        //1.定義要排序的數組
        int[] arr = {5,2,6,8,4,3,7};
        //2.定義變量low保存數組中第一個元素的索引
        int low = 0;
        //3.定義變量high保存數組中最後一個元素的索引
        int high = arr.length - 1;
        System.out.println("排序前的元素:" + Arrays.toString(arr));
        quickSort(arr, low, high);
        System.out.println("排序後的元素:" + Arrays.toString(arr));
    }
public static void quickSort(int[] arr,int low,int high){
        //1.定義變量來保存數組第一個元素在數組拍完序後的位置
        int position;
        if(low < high){
            position = findPosition(arr,low,high);
            //2.對小於數組中第一個數的部分進行快速排序
            quickSort(arr, low, position - 1);
            //3.對大於數組中第一個數的部分進行快速排序
            quickSort(arr, position + 1, high);
        }
    }
//查找第一個元素在要排序的數中的位置
    //當low=high的時候,low和high的值就是第一個元素排序完在數組中的值
    public static int findPosition(int[] arr,int low,int high){
        //1.定義變量temp保存數組的第一個元素
        int temp = arr[low];
        while(low < high){
            //2.high索引對應的元素比temp大,--high
            while(low < high && arr[high] >= temp){
                --high;
            }
            //3.循環結束,high索引對應的值小於第一個元素,將high索引對應的值賦值給low索引對應的值
            arr[low] = arr[high];
            //4.low索引對應的元素比temp小,++low
            while(low < high && arr[low] <= temp){
                ++low;
            }
            //5.循環結束,low索引對應的值大於第一個元素,將low索引對應的值賦值給high索引對應的值
            arr[high] = arr[low];
        }
        //6.將數組第一個元素放置在數組排序完的位置上
        arr[low] = temp;
        //7.最外層循環接收,low=high,第一個元素在拍完序中的位置就是low和hight的值
        return low;
    }
快速排序的時間複雜度爲O(nlogn)
冒泡排序和選擇排序的時間複雜度爲O(n^2)
相關文章
相關標籤/搜索