快速排序 Nim 语言实现

快速排序是一种平均时间复杂度为 nlog(n) 的原地排序,很适合大规模数据排序。它采用一种分而治之的手段,划分子问题,并递归地求解问题,最后将子问题的解合并为原问题的解。

快速排序的思想:在待排序列表中寻找一个分位点,处理列表,使得分位点左边是小于分位点处元素的子列表,而分位点右面是大于分位点元素的子列表。然后在子列表中选取分位点,重复上述操作,直到列表为单元素列表,合并子列表即可得到有序列表。

预处理
随机产生分位点

将分位点处的元素与首元素交换

交换
使变量 i “指向” 第二个元素,而变量 j “指向” 末尾元素。向右移动变量 i(i ++),直到变量 i “指向” 一个大于分位点的数值。这时向左移动变量 j (j --),直到变量j “指向” 一个小于分位点的元素。如果这时 i < j,那么就交换 i, j所在位置的元素。如果 i > j,跳出循环,并交换 j 和首地址所在位置的元素。

到这时,我们已经成功找到一个分位点。分位点左面的元素都小于等于分位点元素,分位点右面的元素都大于等于分位点元素。我们然后继续在左右部分各自寻找新的分位点。

最终代码

### 微信公众号:nim编程
import random


# 交换元素
proc swap(list: var seq[int], i: int, j: int) =
  let temp = list[i]
  list[i] = list[j]
  list[j] = temp 


proc qsort(list: var seq[int], lo: int, hi: int) =
    # 基准条件
    if lo >= hi:
      return 
    #
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值