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

分治法--快速排序

	對於快速排序法的思想是用分治法解決問題,將一個大的問題分化成多個小問題進行解決。
	每次以最左邊的元素為中心,將比其小的元素放在其左邊,比其大的元素放在其右邊,然後對其左邊和右邊的元素分別如此進行遞迴操作,如此便可以將元素進行從小到大的排序。
	若要進行從大到小的排序,則將比其大的放在其左邊,比其小的放在右邊,如此遞迴則可以得到從大到小的排序。

import java.util.Arrays;

public class QuickSort {
	
	public static void main(String[]args){
		int []arr = {9,5,8,15,3,12,7,1,24,14,4,6};		//定義陣列,對陣列元素進行排序
		int left=0;
		int right=arr.length-1;
		Quick(arr,left,right);				//對陣列進行排序
		System.out.println(Arrays.toString(arr));
	}
	
	/**
	 * 分治,劃分為小的問題
	 * 每次以最左邊元素為中心,將小於該元素的元素放在其左邊,大於該元素的元素放在其右邊
	 * @param arr
	 * @param left
	 * @param right
	 */
	public static void Quick(int []arr, int left, int right){
		System.out.println(Arrays.toString(arr));
		if(left<right){
			int q = partition(arr,left,right);	//計算排序後最左邊元素所在位置
			Quick(arr, left, q-1);		//左分治
			Quick(arr, q+1, right);		//右分治
		}
	}
	
	public static int partition(int []arr, int left, int right){
		int q=left,s;
		int t = arr[left];
		for(int i=left+1;i<=right;i++){
			if(arr[i]<t){	//判斷選中元素是否小於最左邊元素
				s=arr[i];	//將選中元素進行備份
				for(int j=i;j>left;j--){	//從left位置開始到i-1位置整體右移
					arr[j]=arr[j-1];
				}
				arr[left]=s;		//將選中元素移動到left位置
				q=q+1;		//對t元素進行定位
			}
		}
		return q;
	}
	
}