java排序演算法(五):快速排序,java排序演算法
java排序演算法(五):快速排序
快速排序是一個速度非常快的交換排序演算法,它的基本思路很簡單,從待排的資料序列中任取一個資料(如第一個資料)作為分界值,所有比它小的元素放到左邊。所有比它大的元素放到右邊。經過這樣一趟下來,該序列形成左右兩個子序列,左邊序列中的資料元素的值都比分界值小,右邊序列中資料元素的值都比分界值大。接下來對左右兩個序列進行遞迴排序。對兩個子序列重新選擇中心元素並依此規則調整。直到每個元素子表的元素只剩下一個元素則排序成功
思路
1、定義一個變數 i變數從左邊第一個索引開始,找大於分界值的元素的索引,並用i來記錄它。
2、定義一個j變數,j變數從右邊第一個索引開始,找小於分界值的元素的索引,並用j來記錄它。
3、如果i < j,交換i、j兩個索引處的元素
重複執行以上1、2、3步驟,直到i>=j,可以判斷j左邊的資料元素都小於分界值,j右邊的資料元素都大於分界值,最後將分界值j索引處的元素交換即可
時間複雜度
最好情況(每次總是選到中間值樞軸)Tn = o(nlogn)
最壞情況:(每次總是選到最小或者最大元素作為樞軸)
做n-1趟,每次比較n-i次。總的比較次數最大;[o(n2)]
平均時間複雜度是T(n) = o(logn)
代碼實現
package com.spring.test;import com.sun.org.apache.bcel.internal.generic.SWAP;import java.awt.print.PrinterGraphics;/** * 快速排序 */public class QuickSortTest { public static void main(String[] args) { int[] data = new int[] { 5, 3, 6, 2, 1, 9, 4, 8, 7 }; print(data); quickSort(data,0,data.length-1); System.out.println("排序後的數組"); print(data); } /** * 快速排序 * @param data * @param start * @param end */ public static void quickSort(int[] data,int start,int end){ if(start >= end){ return; } //以起始索引為臨界點 int point = data[start]; int i = start + 1; int j = end; while(true){ while(i<end && data[i] < point){ i++; } while(i> start && data[j] > point){ j--; } if(i < j){ swap(data,i,j); }else{ break; } } //交換j和分界點的值 swap(data,start,j); print(data); //遞迴在子序列 quickSort(data,start,j-1); quickSort(data,j+1,end); } /** * 交換資料 */ public static void swap(int[] data,int i,int j){ if(i==j){ return; } data[i] = data[i]+data[j]; data[j] = data[i]-data[j]; data[i] = data[i]-data[j]; } /** * 列印輸出 */ public static void print(int[] data){ for(int i=0;i<data.length;i++){ System.out.print(data[i]+"\t"); } System.out.println(); }}
運行結果