面試經典算法:快速排序Golang實現


Golang快速排序

定義

快速排序由C. A. R. Hoare在1962年提出。快速排序是對冒泡排序的一種改進,采用了一種分治的策略。

基本思想

通過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一部分的所有數據都要小,然后再按此方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數據變成有序序列。

步驟

  1. 先從數列中取出一個數作為基准數。
  2. 分區過程,將比這個數大的數全放到它的右邊,小於或等於它的數全放到它的左邊。
  3. 再對左右區間重復第二步,直到各區間只有一個數。
package main

import "fmt"

/************************************
 *函數名:quicksort
 *作用:快速排序算法
 *參數:
 *返回值:無
 *模擬:
	begin:[]int{12, 85, 25, 16, 34, 23, 49, 95, 17, 61}
	-->[],12,[25 16 34 23 49 95 17 61]
	---->[23 16 17],25,[95 49 61 85]
	------>[17 16],23,[]
	-------->[16],17,[]
	---------->[],16,[]
	------>[34 49 61 85],95,[]
	-------->[],34,[61 85 95]
	---------->[49],61,[95]
	------------>[],49,[]
	------------>[85],95,[]
	-------------->[],85,[]
	last:[]int{12, 16, 17, 23, 25, 34, 49, 61, 85, 95}
 ************************************/
 
func quicksort(array []int, begin, end int, mark string) {
	var i, j int
	if begin < end {
		i = begin + 1 // 將array[begin]作為基准數,因此從array[begin+1]開始與基准數比較!
		j = end       // array[end]是數組的最后一位

		for {
			if i >= j {
				break
			}
			if array[i] > array[begin] {
				array[i], array[j] = array[j], array[i]
				j = j - 1
			} else {
				i = i + 1
			}

		}

		/* 跳出while循環后,i = j。
		 * 此時數組被分割成兩個部分  -->  array[begin+1] ~ array[i-1] < array[begin]
		 *                           -->  array[i+1] ~ array[end] > array[begin]
		 * 這個時候將數組array分成兩個部分,再將array[i]與array[begin]進行比較,決定array[i]的位置。
		 * 最后將array[i]與array[begin]交換,進行兩個分割部分的排序!以此類推,直到最后i = j不滿足條件就退出!
		 */
		if array[i] >= array[begin] { // 這里必須要取等“>=”,否則數組元素由相同的值時,會出現錯誤!
			i = i - 1
		}

		array[begin], array[i] = array[i], array[begin]
		fmt.Printf("%s>%v,%d,%v\n", mark, array[begin:i], array[i], array[j:end])
		quicksort(array, begin, i, mark+"--")
		quicksort(array, j, end, mark+"--")
	}
}

func main() {

	nums := []int{12, 85, 25, 16, 34, 23, 49, 95, 17, 61}
	fmt.Printf("begin:%#v\n", nums)

	// 縮進
	mark := "--"
	quicksort(nums, 0, len(nums)-1, mark)
	fmt.Printf("last:%#v\n", nums)
}

轉載請注明:http://www.lenggirl.com/algorithm/quicksort.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM