時間複雜度的簡介算法
算法的時間複雜度是一個函數,描述了算法的執行時間。一般使用大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)