GO实现 快速排序算法

快速排序算法,又称分治法;

1 对一组找个基准数;

2 将该组数分为小于、大于基准数置于左右两侧;

3 再对左右两侧做重复2的操作

平均时间复杂度是O(nlogn)

以下是Go的实现方式

package main

import ("fmt")

//时间复杂度:最坏的情况O(n*n)
//            最好的情况O(nlogn)
// 			  平均O(nlogn)
//有临时变量的情况
func qsort(arr []int, lf, rg int){
	i := lf
	j := rg
	tmp := arr[lf]
	p := lf

	for i < j {
		for j > p && arr[j] >= tmp {
			j--
		}
		if j > p {
			arr[p] = arr[j]
			p = j
		}

		for i < p && arr[i] < tmp {
			i++
		}
		if i < p {
			arr[p] = arr[i]
			p = i
		}
	}
	arr[p] = tmp

	fmt.Println(arr, tmp)
	if p > lf {
		qsort(arr, lf, p - 1)
	}
	if rg > p {
		qsort(arr, p + 1, rg)
	}
}

//无临时变量
func qsort2(arr []int, lf, rg int){
	if lf >= rg { //这个效率高
		return
	}
	i, j := lf, rg
	x := arr[lf]
	for i < j {
		for i < j && arr[j] > x {
			j--
		}
		if i < j {
			arr[i] = arr[j]
			i++
		}

		for i < j && arr[i] < x {
			i++
		}
		if i < j {
			arr[j] = arr[i]
			j--
		}
	}
	arr[i] = x
	fmt.Println(arr, x)
	if i > lf {
		qsort2(arr, lf, i)
	}
	if i < rg {
		qsort2(arr, i + 1, rg)
	}
}

func main() {
	fmt.Println("hello world")
	arr := []int{5, 8, 9, 6, 3, 4, 7, 2}
	//qsort(arr, 0, len(arr) - 1)
	qsort2(arr, 0, len(arr) - 1)
	fmt.Println(arr)
}

qsort 的排序过程输出:

D:\work\go\src>sort.exe
[2 4 3 5 6 9 7 8] 5
[2 4 3 5 6 9 7 8] 2
[2 3 4 5 6 9 7 8] 4
[2 3 4 5 6 9 7 8] 3
[2 3 4 5 6 9 7 8] 6
[2 3 4 5 6 8 7 9] 9
[2 3 4 5 6 7 8 9] 8
[2 3 4 5 6 7 8 9] 7
[2 3 4 5 6 7 8 9]


qsort2的排序过程输出:

#有 lf >= rg return 时
D:\work\go\src>sort2.exe
[2 4 3 5 6 9 7 8] 5
[2 4 3 5 6 9 7 8] 2
[2 3 4 5 6 9 7 8] 4
[2 3 4 5 6 9 7 8] 3
[2 3 4 5 6 9 7 8] 6
[2 3 4 5 6 8 7 9] 9
[2 3 4 5 6 7 8 9] 8
[2 3 4 5 6 7 8 9] 7
[2 3 4 5 6 7 8 9]

#无lf >= rg return 时
D:\work\go\src>go build -o sort2.exe sort.go
D:\work\go\src>sort2.exe
[2 4 3 5 6 9 7 8] 5
[2 4 3 5 6 9 7 8] 2
[2 3 4 5 6 9 7 8] 4
[2 3 4 5 6 9 7 8] 3
[2 3 4 5 6 9 7 8] 4
[2 3 4 5 6 9 7 8] 5
[2 3 4 5 6 9 7 8] 6
[2 3 4 5 6 8 7 9] 9
[2 3 4 5 6 7 8 9] 8
[2 3 4 5 6 7 8 9] 7
[2 3 4 5 6 7 8 9] 8
[2 3 4 5 6 7 8 9] 9
[2 3 4 5 6 7 8 9]



参考:

http://baike.baidu.com/link?url=F1Oc-mApRFTe1vN50nFvjUjONeXHAL32GKV2MLvyv6q73Fb13B_QzQrQesLYtF_WeqGoyewE-ONjYFtZDoQnEF_ji3951uC3v0cL2vRa9vA4Gc_LdO701FJaOZK5ngS6QpJyxlr-HZI7uQ0o-_jV0_

http://blog.csdn.net/morewindows/article/details/6684558

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值