快速排序法(golang实现)

  • Post author:
  • Post category: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)
}



版权声明:本文为qq_36520153原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。