• 排序之快速排序


    快速排序(从小到大)

    思路:

    1. 排序数组[90, 61, 60, 10, 20, 50]
    2. 首先以数组长度二分之一为参照值 索引为2  参照值就是60,在左边找到,比参照值小的大的,此例90就是  索引为0
    3. 接着在参照值右边找到比参照值小的值, 这里就是50 索引为 5
    4. 交换两个所以的值 第一次循环排序后的结果为  [50, 61, 60, 10, 20, 90]
    5.  进入下一次循环, 此时参照值还是 60  ,继续找到左边 61  ,右边找到20  ,交换结果为  [50, 20, 60, 10, 61, 90]
    6. 继续循环  l 为 2  , r 为3  交换  结果为[50, 20, 10, 60, 61, 90], arr[r]  = 60 则把 l+1    此时l为3  r 为3  ,跳出循环, l = r  则把 l++ r--   则此时 l为4  r为2进入到 递归阶段了
    7.  此时进入向左递归   left = 0  right = 2  arr为 [50, 20, 10, 60, 61, 90]
    8.  参照值为20 , 此时 左边递归内l = 1  r=2  交换得到 [10, 20, 50, 60, 61, 90]
    9. 继续循环  l=1   r = 1  ,跳出循环   l=2  r = 0  这里向左递归已完成
    10. 向右递归   left = 4   right = 5    arr为 [10, 20, 50, 60, 61, 90], 循环完成 l=r 则也结束循环
    11. 最终得到结果[10, 20, 50, 60, 61, 90]

    注:内部的优化,是加快效率,因为,不优化会多一次循环

    1. func QuickSort(left, right int, array *[arrSize]int) {
    2. l := left
    3. r := right
    4. pivot := array[(left+right)/2]
    5. //for循环的目标是将比pivot小的数放在左边,比pivot大的数放在右边
    6. for l < r {
    7. //从pivot左边找到一个大于等于pivot的值
    8. //重新排序后,会把排序过后的重新检查一遍
    9. for array[l] < pivot {
    10. l++
    11. }
    12. //从pivot右边找到小于等于pivot的值
    13. for array[r] > pivot {
    14. r--
    15. }
    16. //表明本次分解任务完成
    17. if l >= r {
    18. break
    19. }
    20. //交换
    21. array[l], array[r] = array[r], array[l]
    22. fmt.Println(array)
    23. //优化:这里是条件符合,说明另外一边刚好就是pivot,则下一轮不需要做判断,可以直接跳过,节省一次循环
    24. if array[l] == pivot {
    25. r--
    26. }
    27. if array[r] == pivot {
    28. l++
    29. }
    30. // fmt.Printf("%v\n", *array)
    31. }
    32. //可注释以下代码做测试
    33. //如果l==r,再移动下
    34. //这里注释会报错,会死循环造成栈溢出
    35. if l == r {
    36. l++
    37. r--
    38. }
    39. //向左递归
    40. if left < r {
    41. QuickSort(left, r, array)
    42. }
    43. //向右递归
    44. if right > l {
    45. QuickSort(l, right, array)
    46. }
    47. }
    48. func main() {
    49. arr := [arrSize]int{90, 61, 60, 10, 20, 50}
    50. //rand.Seed(time.Now().UnixNano())
    51. //for i := 0; i < arrSize; i++ {
    52. // arr[i] = rand.Intn(arrSize)
    53. //}
    54. start := time.Now()
    55. QuickSort(0, len(arr)-1, &arr)
    56. elapse := time.Since(start)
    57. fmt.Println("消耗时间:", elapse, arr)
    58. }

  • 相关阅读:
    【雷达通信】基于matlab线性调频脉冲雷达仿真【含Matlab源码 2104期】
    是机遇还是挑战?AI 2022五大预测
    四甲基罗丹明-5(6)-异硫氰酸酯,5(6)-Tetramethylrhodamine isothiocyanate
    如何定时备份使用Docker构建的MySQL容器中的数据库
    thinkphp5 加载静态资源路径与常量的方法
    低代码助力疫情防控:综合管理系统模板
    金融业务系统: Service Mesh用于安全微服务集成
    【wpf】Command Binding 命令绑定的使用
    MySQL8 创建函数报错:This function has none of DETERMINISTIC
    乐观锁和悲观锁在kubernetes中的应用
  • 原文地址:https://blog.csdn.net/qq_28710983/article/details/126336583