核心思想
遞歸算法
代碼實現
func quickSort(front, rear int, array []int) {
left := front
right := rear
pivot := array[(front+rear)/2]
for left < right {
for array[left] > pivot {
left++
}
for array[right] < pivot {
right--
}
if left >= right {
break
}
array[left], array[right] = array[right], array[left]
if array[right] == pivot {
left++
}
if array[left] == pivot {
right--
}
}
if left == right {
left++
right--
}
if rear > left {
quickSort(left, rear, array)
}
if front < right {
quickSort(front, right, array)
}
}
// 快速排序 200000萬的數據量運行1s內
func TestQuickSort(t *testing.T) {
var arr []int
var maxSize = 10
nowTime1 := time.Now().Unix()
rand.Seed(time.Now().Unix())
for i := 0; i < maxSize; i++ {
n := rand.Int() % 100
arr = append(arr, n)
}
t.Log("size:", len(arr), "quick 原數據", arr)
quickSort(0, len(arr)-1, arr)
nowTime2 := time.Now().Unix()
t.Log("修改後 :", arr, "耗時:", nowTime2-nowTime1, "size:", len(arr))
}
以上代碼測試結果輸出如下,從大到小排序
如果是從小到大呢?只需要改動兩個地方即可,口水話少說,上代碼
// 快速排序 200000萬的數據量運行1s內
func TestQuickSort(t *testing.T) {
var arr []int
var maxSize = 10
nowTime1 := time.Now().Unix()
rand.Seed(time.Now().Unix())
for i := 0; i < maxSize; i++ {
n := rand.Int() % 100
arr = append(arr, n)
}
t.Log("size:", len(arr), "quick 原數據", arr)
quickSort(0, len(arr)-1, arr)
nowTime2 := time.Now().Unix()
t.Log("修改後 :", arr, "耗時:", nowTime2-nowTime1, "size:", len(arr))
}
// 快排使用遞歸
func quickSort(front, rear int, array []int) {
left := front
right := rear
pivot := array[(front+rear)/2]
for left < right {
for array[left] < pivot {
left++
}
for array[right] > pivot {
right--
}
if left >= right {
break
}
array[left], array[right] = array[right], array[left]
if array[right] == pivot {
left++
}
if array[left] == pivot {
right--
}
}
if left == right {
left++
right--
}
if rear > left {
quickSort(left, rear, array)
}
if front < right {
quickSort(front, right, array)
}
}
結果輸出如下: