快速排序算法


写在前面

今天在写leetcode算法题6316. 重排数组以得到最大前缀分数的时候,总是超时,最后看别人的解答,发现思路是差不多的,先排序,然后遍历求和。

仔细看别人的代码,排序使用的是python语言自带的sort函数。唯一的区别是排序算法,我使用的是快速选择排序。众所周知快速选择排序的时间复杂度永远是O(n*n),因此欢迎是排序算法导致耗时。准备改成快速排序。

快速排序算法有一段时间没有写了,参考这或许是东半球讲十大排序算法最好的一篇文章,其实这篇文章里面写的快速排序算法是有问题,最后通过在网上查找其他快速排序算法思想,让我想起了快速排序的思路,于是自己写,很快就写出来的。

快速排序代码

func FastSort(data []int) []int {
	fastSort(data, 0, len(data)-1)
	return data
}

func fastSort(data []int, begin, end int) {
	if begin >= end {
		return
	}
	mid := findMid(data, begin, end)
	fastSort(data, begin, mid-1)
	fastSort(data, mid+1, end)
}

func findMid(data []int, begin, end int) int {
	if begin >= end {
		return end
	}

	i, j := begin, end
	for i < j {
		for j > i && data[j] > data[i] {
			j--
		}
		if j == i {
			break
		}
		data[i], data[j] = data[j], data[i]
		i++

		for i < j && data[i] < data[j] {
			i++
		}
		if i == j {
			break
		}
		data[i], data[j] = data[j], data[i]
		j--
	}
	return i
}

题目代码

func MaxScore(nums []int) int {
	nums = FastSort(nums)
	sum := 0
	count := 0
	for i := len(nums) - 1; i >= 0; i-- {
		if i == len(nums)-1 {
			if nums[i] == 0 {
				break
			}
		}
		sum += nums[i]
		if sum > 0 {
			count += 1
		}
		if sum == 0 {
			break
		}
	}
	return count
}

结果:程序通过

源代码:https://github.com/ZBIGBEAR/sort/blob/master/memery_sort/swap_sort/fast_sort.go

总结

学习一定要搞懂原理,不能只看别人的代码,别人代码有可能是错的。弄懂原理自己写更好。

参考

[1]这或许是东半球讲十大排序算法最好的一篇文章

[2]6316. 重排数组以得到最大前缀分数


文章作者: Alex
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Alex !
  目录