1. 程式人生 > >Java實現排序演算法之快速排序

Java實現排序演算法之快速排序

一、綜述

       快速排序是交換排序中的一種,平均演算法複雜度是O(nlogn),最壞O(n*n)。下面用Java實現一個快速排序,並用註釋的方式解釋了思想和原理。

二、Java實現堆排序

package com;

/**
 * @author 王勤為
 * 
 *         這個是實現快速排序的類
 * 
 *         快速排序的基本思想是分治法:
 * 
 *         1.先從數列中取出一個數作為基準數。
 * 
 *         2.分割槽過程,將比這個數大的數全放到它的右邊,小於或等於它的數全放到它的左邊。
 * 
 *         3.再對左右區間重複第二步,直到各區間只有一個數。
 * 
 *
 */
public class AQuickSort {

	public static void quickSort(int[] a, int left, int right) {

		if (left == right | left > right) { // 終止條件
			return;
		}
		int i = left, j = right; // 定義兩個指標,一個從左往右遍歷,一個從右往左遍歷
		int x = a[left]; // 定義基準數,預設 是陣列第一個

		while (i < j) {

			while (a[j] >= x & i < j) { // 如果j指向的數比基數大,繼續往左移動指標
				j--;
			}
			while (a[i] <= x & i < j) { // 如果i指向的數比基數小,繼續往右移動指標
				i++;
			}
			swap(a, i, j);
		}
		// 以上程式碼過後 i==j 此時,把基數和i指向的數交換位置
		swap(a, left, i);

		// 遞迴處理基數左邊的數列和右邊的數列
		quickSort(a, left, i - 1);
		quickSort(a, i + 1, right);

	}

	// 交換元素的方法
	public static void swap(int[] a, int left, int right) {
		if (a == null | left == right | a.length < 2)
			return;
		int temp = a[left];
		a[left] = a[right];
		a[right] = temp;
	}

}
三、結果檢驗
public class maintest {
	public static void main(String[] args) {

		int[] a = { 45, 6, 43, 78, 12, 90, 23, 21, 41, 64, 31, 91, 81, 6,45,89,43,12,13,33,99,456,789 };

		AQuickSort.quickSort(a, 0, a.length-1);

		for (int e : a) {
			System.out.print(e + "  ");

		}

	}
}

//呼叫輸出結果為:6  6  12  12  13  21  23  31  33  41  43  43  45  45  64  78  81  89  90  91  99  456  789