1. 程式人生 > >快速排序法(golang實現)

快速排序法(golang實現)

快速排序是由東尼·霍爾所發展的一種排序演算法。在平均狀況下,排序 n 個專案要Ο(n log n)次比較。在最壞狀況下則需要Ο(n2)次比較,但這種狀況並不常見。事實上,快速排序通常明顯比其他Ο(n log n) 演算法更快,因為它的內部迴圈(inner loop)可以在大部分的架構上很有效率地被實現出來,且在大部分真實世界的資料,可以決定設計的選擇,減少所需時間的二次方項之可能性。

package test

import (
	"fmt"
	"testing"
)

func TestFastSort(t *testing.T) {
	testArr := []int{2, 5, 3, 7, 4, 5, 8, 1, 4, 0}
	testSort(testArr, 0, len(testArr)-1)
	fmt.Println(testArr)
}

/**
快速排序:分治法+遞迴實現
隨意取一個值A,將比A大的放在A的右邊,比A小的放在A的左邊;然後在左邊的值AA中再取一個值B,將AA中比B小的值放在B的左邊,將比B大的值放在B的右邊。以此類推
*/

func quickSort(arr []int, first, last int) {
	flag := first
	left := first
	right := last

	if first >= last {
		return
	}
	// 將大於arr[flag]的都放在右邊,小於的,都放在左邊
	for first < last {
		// 如果flag從左邊開始,那麼是必須先從有右邊開始比較,也就是先在右邊找比flag小的
		for first < last {
			if arr[last] >= arr[flag] {
				last--
				continue
			}
			// 交換資料
			arr[last], arr[flag] = arr[flag], arr[last]
			flag = last
			break
		}
		for first < last {
			if arr[first] <= arr[flag] {
				first++
				continue
			}
			arr[first], arr[flag] = arr[flag], arr[first]
			flag = first
			break
		}
	}

	quickSort(arr, left, flag-1)
	quickSort(arr, flag+1, right)
}