1、動圖演示java
2、思路分析算法
快速排序的思想就是,選一個數做爲基數(這裏我選的是第一個數),大於這個基數的放到右邊,小於這個基數的放到左邊,等於這個基數的數能夠放到左邊或右邊,看本身習慣,這裏我是放到了左邊,數組
一趟結束後,將基數放到中間分隔的位置,第二趟將數組從基數的位置分紅兩半,分割後的兩個的數組繼續重複以上步驟,選基數,將小數放在基數左邊,將大數放到基數的右邊,在分割數組,,,直到數組不能再分爲止,排序結束。ui
例如從小到大排序:spa
1. 第一趟,第一個數爲基數temp,設置兩個指針left = 0,right = n.length,指針
①從right開始與基數temp比較,若是n[right]>基數temp,則right指針向前移一位,繼續與基數temp比較,直到不知足n[right]>基數tempcode
②將n[right]賦給n[left]blog
③從left開始與基數temp比較,若是n[left]<=基數temp,則left指針向後移一位,繼續與基數temp比較,直到不知足n[left]<=基數temp排序
④將n[left]賦給n[rigth]遞歸
⑤重複①-④步,直到left==right結束,將基數temp賦給n[left]
2. 第二趟,將數組從中間分隔,每一個數組再進行第1步的操做,而後再將分隔後的數組進行分隔再快排,
3. 遞歸重複分隔快排,直到數組不能再分,也就是隻剩下一個元素的時候,結束遞歸,排序完成
根據思路分析,第一趟的執行流程以下圖所示:
3、負雜度分析
1. 時間複雜度:
最壞狀況就是每一次取到的元素就是數組中最小/最大的,這種狀況其實就是冒泡排序了(每一次都排好一個元素的順序)
這種狀況時間複雜度就好計算了,就是冒泡排序的時間複雜度:T[n] = n * (n-1) = n^2 + n;
最好狀況下是O(nlog2n),推導過程以下:
(遞歸算法的時間複雜度公式:T[n] = aT[n/b] + f(n) )
因此平均時間複雜度爲O(nlog2n)
2. 空間複雜度:
4、Java 代碼以下
import java.util.Arrays; public class quick{ public static void main(String[] args) { int[] arr = new int[]{10,6,3,8,33,27,66,9,7,88}; f(arr,0,arr.length-1); System.out.println(Arrays.toString(arr)); } public static void f(int[] arr,int start,int end){ //直到start=end時結束遞歸
if(start<end){ int left = start; int right = end; int temp = arr[start]; while(left<right){ //右面的數字大於標準數時,右邊的數的位置不變,指針向左移一個位置
while(left<right && arr[right]>temp){ right--; } //右邊的數字小於或等於基本數,將右邊的數放到左邊
arr[left] = arr[right]; left++; ////左邊的數字小於或等於標準數時,左邊的數的位置不變,指針向右移一個位置
while(left<right && arr[left]<=temp){ left++; } //左邊的數字大於基本數,將左邊的數放到右邊
arr[right] = arr[left]; } //一趟循環結束,此時left=right,將基數放到這個重合的位置,
arr[left] = temp; System.out.println(Arrays.toString(arr)); //將數組從left位置分爲兩半,繼續遞歸下去進行排序
f(arr,start,left); f(arr,left+1,end); } } }