java 排序演算法之快速排序(挖坑法)
阿新 • • 發佈:2019-01-27
快速排序是(挖坑法)是挖坑填數 + 分治來實現。
快速排序的基本思想:
1.先從數列中取出一個數作為基準數。
2.分割槽過程,將比這個數大的數全放到它的右邊,小於或等於它的數全放到它的左邊。
3.再對左右區間重複第二步,直到各區間只有一個數。
直接上程式碼:
package com.wang.sort; import java.util.Arrays; /** * 快速排序之填坑法(挖坑法)<br> * 從數列中挑出一個元素,稱為 “基準”(pivot)<br> * 重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面<br> * 相同的數可以到任一邊)。在這個分割槽退出之後,該基準就處於數列的中間位置。這個稱為分割槽<br> * (partition)操作<br> * 遞迴地(recursive)把小於基準值元素的子數列和大於基準值元素的子數列排序。 * @author wang * @Date 2018年4月16日 * */ public class QuickSort { public static void main(String[] args) { int[] arrays = {12,21,3,5,2,18,7,4,11,9,12}; System.out.println("快速排序之挖坑排序前的陣列:" +Arrays.toString(arrays)); pothlingSort(arrays, 0 , arrays.length - 1); System.out.println("快速排序之挖坑排序後的陣列:" +Arrays.toString(arrays)); } /** * 挖坑法 * @param arrays * @param low * @param high */ public static void pothlingSort(int[] arrays , int low , int high){ if(low < high){ //求每次分治的分割線 int divideIndex = getDivideIndex(arrays,low,high); //再遞迴分別對分割的倆個子陣列進行遞迴排序 pothlingSort(arrays,low,divideIndex -1); pothlingSort(arrays,divideIndex + 1, high); } } private static int getDivideIndex(int[] arrays, int low, int high) { // 將陣列最左端arrays[0]作為預設的基準值,將最左端的值放至基準值的坑內。 // 此時arrays[0]沒有值了,需要從最右端找到一個比基準值小的數填至[0]這個坑。 // 再從左到右找到一個比基準值大的數填到剛才的坑。迴圈進行直到low=high // 將基準值填至剛才的low位置。再進行分治 int baseValue = arrays[low]; arrays[low] = 0 ; while (low < high){ while(low < high && arrays[high] >= baseValue){ high--; } arrays[low] = arrays[high] ; arrays[high] = 0 ; while(low < high && arrays[low] <= baseValue){ low++; } arrays[high] = arrays[low] ; arrays[low] = 0 ; } if(low == high){ arrays[low] = baseValue; } return low; } }