1. 程式人生 > >java 排序演算法之快速排序(挖坑法)

java 排序演算法之快速排序(挖坑法)

快速排序是(挖坑法)是挖坑填數 + 分治來實現。

快速排序的基本思想:

     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;
	}
}