使用go递归快排

- 日理万妓 2023-06-23 09:56 7阅读 0赞

使用go递归快排

  • 核心思想
    • 代码实现

核心思想

递归算法

代码实现

  1. func quickSort(front, rear int, array []int) {
  2. left := front
  3. right := rear
  4. pivot := array[(front+rear)/2]
  5. for left < right {
  6. for array[left] > pivot {
  7. left++
  8. }
  9. for array[right] < pivot {
  10. right--
  11. }
  12. if left >= right {
  13. break
  14. }
  15. array[left], array[right] = array[right], array[left]
  16. if array[right] == pivot {
  17. left++
  18. }
  19. if array[left] == pivot {
  20. right--
  21. }
  22. }
  23. if left == right {
  24. left++
  25. right--
  26. }
  27. if rear > left {
  28. quickSort(left, rear, array)
  29. }
  30. if front < right {
  31. quickSort(front, right, array)
  32. }
  33. }
  34. // 快速排序 200000万的数据量运行1s内
  35. func TestQuickSort(t *testing.T) {
  36. var arr []int
  37. var maxSize = 10
  38. nowTime1 := time.Now().Unix()
  39. rand.Seed(time.Now().Unix())
  40. for i := 0; i < maxSize; i++ {
  41. n := rand.Int() % 100
  42. arr = append(arr, n)
  43. }
  44. t.Log("size:", len(arr), "quick 原数据", arr)
  45. quickSort(0, len(arr)-1, arr)
  46. nowTime2 := time.Now().Unix()
  47. t.Log("修改后 :", arr, "耗时:", nowTime2-nowTime1, "size:", len(arr))
  48. }

以上代码测试结果输出如下,从大到小排序
在这里插入图片描述
如果是从小到大呢?只需要改动两个地方即可,口水话少说,上代码

  1. // 快速排序 200000万的数据量运行1s内
  2. func TestQuickSort(t *testing.T) {
  3. var arr []int
  4. var maxSize = 10
  5. nowTime1 := time.Now().Unix()
  6. rand.Seed(time.Now().Unix())
  7. for i := 0; i < maxSize; i++ {
  8. n := rand.Int() % 100
  9. arr = append(arr, n)
  10. }
  11. t.Log("size:", len(arr), "quick 原数据", arr)
  12. quickSort(0, len(arr)-1, arr)
  13. nowTime2 := time.Now().Unix()
  14. t.Log("修改后 :", arr, "耗时:", nowTime2-nowTime1, "size:", len(arr))
  15. }
  16. // 快排使用递归
  17. func quickSort(front, rear int, array []int) {
  18. left := front
  19. right := rear
  20. pivot := array[(front+rear)/2]
  21. for left < right {
  22. for array[left] < pivot {
  23. left++
  24. }
  25. for array[right] > pivot {
  26. right--
  27. }
  28. if left >= right {
  29. break
  30. }
  31. array[left], array[right] = array[right], array[left]
  32. if array[right] == pivot {
  33. left++
  34. }
  35. if array[left] == pivot {
  36. right--
  37. }
  38. }
  39. if left == right {
  40. left++
  41. right--
  42. }
  43. if rear > left {
  44. quickSort(left, rear, array)
  45. }
  46. if front < right {
  47. quickSort(front, right, array)
  48. }
  49. }

结果输出如下:
在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,7人围观)

还没有评论,来说两句吧...

相关阅读

    相关 go -

    递归 递归请参考 [菜鸟教程 - go 递归][- go] 递归并不是我的重点,熟练函数的定义方式才是。 如下这段函数的声明方式需要这样被理解: 在Factori

    相关 rust 双轴

    rust 双轴快排迭代法 思路是用一个Vec当作栈来模拟保存快排的左右边界,思路来自这篇[文章][Link 1],文章只有普通快排,我改成双轴的实现 partion 函