排序算法--快速排序

        快速排序是效率較高的排序方法,採用了分治法。將一個大的數組分解成多個小數組,保證每個小數組是順序的,則整個大數組也就是順序的了。java

        我學習的過程是這樣的:數組

               1 先看了下維基百科上面的解釋。函數

               2 本身分析整個過程。學習

               3 寫代碼實現。ui


        維基百科的解釋以下:spa

  1. 從數列中挑出一個元素,稱爲 "基準"(pivot),
  2. 從新排序數列,全部元素比基準值小的擺放在基準前面,全部元素比基準值大的擺在基準的後面(相同的數能夠到任一邊)。在這個分區退出以後,該基準就處於數列的中間位置。這個稱爲分區(partition)操做。
  3. 遞歸地(recursive)把小於基準值元素的子數列和大於基準值元素的子數列排序。

        有了如上的解釋,咱們本身分析下這個過程。code

        首先是有一個數組。而後咱們隨便選取一個數字做爲基準,將全部小於該數字的元素,移動到左側。全部大於該數字的元素,移動到該數字的右側。咱們這裏有個方法,就是基準元素,老是選擇這個數組序列的第一個元素。這樣的話,咱們只用將小於該數字的元素移動到左側來便可。而後以這個基準元素的下標爲基準點,將該數組分紅兩段,而後針對這兩個數組,肯定其基準,再次排序。一直到全部的元素都肯定順序後,整個排序過程結束。排序

        看看整段代碼的結構。遞歸

package com.bplead.sort;

public class QuickSort {
	
	public static void qsort(int a[],int begin,int end){
		if(begin > end){
			return;
		}	
		prt(a);
		int pivotindex = partition(a,begin,end);
		qsort(a,begin,pivotindex-1);
		qsort(a,pivotindex+1,end);
	}
	
	public static int partition(int a[],int left,int right){
		int keyindex = left;
		int temp = 0;
		for(int i=left+1;i<=right;i++){
			if(a[i] < a[keyindex]){
				temp = a[i];
				for(int j=i;j>keyindex;j--){
					a[j] = a[j-1];
				}
				a[keyindex] = temp;
				keyindex ++;
			}
		}
		return keyindex;

	}
	
	public static void main(String[] args) {
		int array[] = {43,24,12,56,78,9,67,50,1,2,1,9,87};
		qsort(array,0,array.length-1);
		
	}
	
	private static void prt(int[] array){
		for(int i=0;i<array.length;i++)
			System.out.print(array[i] + " ");
		System.out.println();
	}
	
}

        其實,整個快速排序的難點就在於基準元素位置的肯定了。一旦肯定了基準元素的位置,而後以此位置爲分割點,將數組分爲2個,遞歸進行處理便可。

        咱們看一下partition分區函數把。ip

        咱們將基準元素選擇爲第一個元素,循環遍歷整個數組,使其元素和基準元素進行比較,若是遍歷的當前元素比基準元素小,則當前元素之前的全部元素(不包含當前元素)都向右移動一位,當前元素放置到基準元素之前。一個分區函數執行完成後,全部小於該基準元素的元素都會移動到基準元素左側了。

        我這裏把整個快速排序的過程都打印出來了,過程以下:

43 24 12 56 78 9 67 50 1 2 1 9 87 
24 12 9 1 2 1 9 43 56 78 67 50 87 
12 9 1 2 1 9 24 43 56 78 67 50 87 
9 1 2 1 9 12 24 43 56 78 67 50 87 
1 2 1 9 9 12 24 43 56 78 67 50 87 
1 2 1 9 9 12 24 43 56 78 67 50 87 
1 1 2 9 9 12 24 43 56 78 67 50 87 
1 1 2 9 9 12 24 43 56 78 67 50 87 
1 1 2 9 9 12 24 43 56 78 67 50 87 
1 1 2 9 9 12 24 43 50 56 78 67 87 
1 1 2 9 9 12 24 43 50 56 78 67 87 
1 1 2 9 9 12 24 43 50 56 67 78 87 
1 1 2 9 9 12 24 43 50 56 67 78 87 

原數組是:

                 43  24  12  56  78  9  67  50  1  2  1  9  87 

第一次分區操做:咱們選擇43爲基準,則全部小於43的元素均在43左側。獲得以下序列。

                24  12  9  1  2  1  9  43  56  78  67  50  87

第二次分區操做,將43之前的元素看成一個序列,之後的元素也看成一個序列。咱們須要注意的是,已經肯定過的這個基準元素,做爲分割數組的標記,該元素不用劃分到左右兩個數組中。