1. 程式人生 > >演算法學習——快速排序

演算法學習——快速排序

看過了氣泡排序和選擇排序,昨天看了快速排序,對於其中的位置互換理解的有點混亂,直到今天才弄明白是怎麼一回事。過程大概瞭解了,利用了分治的思想,如果要對一個數組進行排序,先取陣列中的一個數作為基準數,遍歷陣列,將陣列中大於該基準數的數放在右邊,小於該基準數的數放在左邊,這樣就將較小的數和較大的數分成了兩個部分,基準數是最後確定位置的,並不是像插入排序一樣先確定基準數的位置,然後再將其它數進行排序。

一次排序進行之後,遞迴將基準數旁邊的兩部分再進行排序,以此類推,直到陣列中所有元素均有序為止。

package pp.suanfa;

/**
 * 快速排序
 * 
 * @author xiaoGd
 *
 */

public class QuickSort {

	public static void sort(int[] array, int low, int high) {
		int i, j, index;
		if (low > high)// 如果元素的位置不合理,直接返回
			return;
		i = low;
		j = high;
		index = array[i];// 挑選隨機基準數
		while (i < j) {
			while (i < j && array[j] > index)
				// 若基準數後面的元素比基準數大,則位置不變,繼續向前比較
				j--;
			if (i < j)// 若基準數後面的元素比基準數小,則將array[i]和array[j]互換位置,i++
				array[i++] = array[j];
			while (i < j && array[i] < index)
				// 若基準數前面的元素比基準數小,則位置不變,繼續向後比較
				i++;
			if (i < j)// 若基準數前面的元素比基準數大,則將array[i]和array[j]互換位置,j--
				array[j--] = array[i];
		}
		array[i] = index;// 最後確定基準數的位置
		sort(array, low, i - 1);
		sort(array, i + 1, high);
	}

	public static void quickSort(int array[]) {
		sort(array, 0, array.length - 1);
	}

	public static void main(String[] args) {
		int[] a = { 2, 0, 3, 5, 4, 8, 7, 6, 1, 9 };
		quickSort(a);
		for (int i = 0; i < a.length; i++) {
			System.out.print(a[i] + " ");
		}
	}
}

排序完成後:

快速排序最壞的時間複雜度為O(n²),最好及平均時間複雜度為O(nlogn).