排序算法-快速排序
阿新 • • 發佈:2017-09-05
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 }
排序算法-快速排序