快速排序法:(用到遞歸演算法) 首先先定義一個數組,這裡定義一個int類型的數組。預定義數組第一個數為基準數Base,再定義兩個游標(索引),分別從數組的最左端和最右端向左和向右進行移動。 迴圈過程:第一次迴圈: 先由右向左移動右側的游標,找到比基準數小的數字就停止。再由左向右移動左側的游標,找到比基 ...
快速排序法:(用到遞歸演算法)
首先先定義一個數組,這裡定義一個int類型的數組。預定義數組第一個數為基準數Base,再定義兩個游標(索引),分別從數組的最左端和最右端向左和向右進行移動。
迴圈過程:
第一次迴圈:
先由右向左移動右側的游標,找到比基準數小的數字就停止。再由左向右移動左側的游標,找到比基準數大的數就停止。這時,交換兩個游標對應的數據值。當左右游標重合時,停止移動游標,一次迴圈結束並將基準數和游標停止位置(重合位置)的值進行交換。這時,第一個基準數所在的位置為正確位置,基準數左側的值都比基準數小,基準數右側的值都比基準數大。
此時將數組分為兩份,基準數左側(0 -> i-1)及基準數右側(i+1 -> arr.length-1)兩部分(不包括基準數)。
以後的迴圈方法調用第一次迴圈(遞歸演算法),只不過左右游標的值不同:
用基準數的左側和右側分別調用迴圈方法,再次進行迴圈;
遞歸結束標誌:
左游標的值大於右游標(索引)的值。
1 package com.wx.demo; 2 3 import java.util.Arrays; 4 5 public class QuickSort { 6 7 public static void main(String[] args) { 8 int[] arr = { 3, 15, 2, 11, 56, 83, 79, 23, 9 }; 9 quickSort(arr); 10 System.out.println(Arrays.toString(arr)); 11 12 } 13 14 public static void quickSort(int[] arr) { 15 quickSort(arr, 0, arr.length - 1); 16 } 17 18 /* 19 * 定義方法,用來快速排序 參數:數組,left,right。 left 從哪個位置開始拍, right排到哪個位置 20 */ 21 public static void quickSort(int[] arr, int left, int right) { 22 if (left > right) { 23 // 如果左邊索引比右邊索引大,就直接結束 24 return; 25 } 26 // 定義基準數 27 int base = arr[left];// 把最左邊的數當成基準數 28 29 // 定義i從做開始檢索,定義j從右開始檢索 30 int i = left; 31 int j = right; 32 33 // 迴圈檢索,當i和j沒有相遇,就一直檢索 34 while (i != j) { 35 // j從右往左檢索 36 // 什麼情況j會從右往左移動 37 while (arr[j] >= base && i < j) { 38 j--; 39 } 40 41 // i從左往右檢索 42 // 如果檢索到的比基準數小或者相等,就一直移動 43 while (arr[i] <= base && i < j) { 44 i++; 45 } 46 47 // i和j停下,交換i和j位置的元素 48 int temp = arr[i]; 49 arr[i] = arr[j]; 50 arr[j] = temp; 51 } 52 // 如果代碼走到這裡,代表i和j相遇了,就把相遇位置的數和基準數進行交換 53 arr[left] = arr[i];// 把i位置的元素賦值給最左邊的元素 54 arr[i] = base;// 把base賦值給相遇位置的元素 55 56 // 排基準數左邊 57 quickSort(arr, left, i - 1); 58 // 排右邊 59 quickSort(arr, j + 1, right); 60 } 61 }