1. 程式人生 > >排序算法-快速排序

排序算法-快速排序

args mob 大於 right cnblogs 指針 sort arr num

參考博文:http://www.cnblogs.com/MOBIN/p/4681369.html

快速排序是冒泡排序的改進版,也是最好的一種內排序,在很多面試題中都會出現

  思想:

    1.在待排序的元素中任取一個元素作為基準(通常選第一個元素,但最好的選擇方法是從待排序元素中隨機選取一個作為基準),稱為基準元素

    2.將待排序的元素進行分區,對基準元素大的元素放到它的右邊,比其小的放在它的左邊

    3.對左右兩個分區重復以上步驟直到所有元素都是有序的

  所以可以把快速排序聯想成東拆西補或西拆東補,一邊拆一邊補,直到所有元素達到有序狀態,

  左邊被拆了,就要遍歷右邊的元素去補,右邊被拆了,就遍歷左邊的元素去補

  實現代碼:

 1 public class QuickSort {
 2     
 3     public static void main(String[] args) {
 4         int[] arr = {5,7,1,8,4};
 5         int _left = 0;
 6         int _right = arr.length-1;
 7         
 8         System.out.print("排序前:" );
 9         for(int num:arr) {
10             System.out.print(num);
11 } 12 13 quickSort(arr,_left,_right); 14 System.out.print("----排序後:" ); 15 for(int num:arr) { 16 System.out.print(num); 17 } 18 } 19 20 private static void quickSort(int[] arr, int _left, int _right) { 21 int left = _left;
22 int right = _right; 23 int base = 0; 24 if(left < right) { 25 base = arr[left]; //我們將base元素單獨拿出,這樣base元素的位置就出現了一個坑 26 while(left != right) { 27 while(left < right && arr[right] >= base) //從右往左找 小於 base 的元素,將其填入base左邊的坑中 28 right--; //這個 while的目的,就是不停地移動right指針,直到某個元素小於base, 29 arr[left] = arr[right]; //小於base的元素是不應該出在右邊的,所以我們把它放到左邊的坑中,這樣在右邊又空出來了一個坑 30 31 while(left < right && arr[left] <= base) //從左往右找 大於 base 的元素,將其填入base右邊的坑中,while的目的和上面類似 32 left++; //用左邊大於base的元素填充右邊的坑, 33 arr[right] = arr[left]; 34 } 35 36 arr[right] = base; //將基準值回歸填充到中間 37 38 quickSort(arr,_left,left - 1); //對基準元素左邊的元素遞歸排序 39 quickSort(arr,right + 1,_right);//對基準元素右邊的元素遞歸排序 40 } 41 } 42 }

排序算法-快速排序