文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Go数据结构与算法基础之快速排序

2024-12-03 01:51

关注

本文转载自微信公众号「光城」,作者 lightcity 。转载本文请联系光城公众号。

最近打算重拾算法,从0跟着acwing走一遍,顺便用Go实现一下。

今天的目标是学习快排,使用Go写。

学习自acwing。

输入:

  1. 1 3 2 

输出:

  1. 1 2 3 

快排思想:

定义pivot

根据pivot划分区间

递归子问题

pivot可以随机选择,例如:arr[l]、arr[r] 等等。

当递归时有两种选择,一种是取j,需要保证pivot不取arr[r],防止死循环。

本文实现用这个:

  1. pivot := arr[(l+r)>>1] 
  2. quickSort(arr, l, j) 
  3. quickSort(arr, j+1, r) 

另一种是取i,需要保证pivot不取arr[l],防止死循环,同时不可以使用 arr[(l+r)>>1]这种,得向上取整,例如:arr[(l+r+1)>>1]。

本文实现用这个:

  1. pivot := arr[(l+r+1)>>1] 
  2. quickSortI(arr, l, i-1) 
  3. quickSortI(arr, i, r) 

最后补充几个go知识。

1.输入

go中处理输入,使用fmt.Scan,将地址传进去,这里我实现了一个函数,后面可以直接复用。

  1. // DoBlackInput 处理空格输入为数组 
  2. func DoBlackInput(n int) []int { 
  3.  arr := make([]int, n) 
  4.  for i := 0; i < n; i++ { 
  5.   fmt.Scan(&arr[i]) 
  6.  } 
  7.  return arr 

2.交换

如何快速交换两个元素。

  1. a, b = b, a 

这样便可以快速交换了。

3.do...while{}

可以使用:

  1. for { 
  2.     // do something 
  3.     if true { 
  4.       break 
  5.     } 
  6.   } 

4.i++与++i

不支持++i、--i。

最后,完整代码如下:

  1. package main 
  2.  
  3. import "fmt" 
  4.  
  5. // DoBlackInput 处理空格输入为数组 
  6. func DoBlackInput(n int) []int { 
  7.  arr := make([]int, n) 
  8.  for i := 0; i < n; i++ { 
  9.   fmt.Scan(&arr[i]) 
  10.  } 
  11.  return arr 
  12.  
  13. // quickSort 取j 
  14. func quickSort(arr []int, l int, r int) { 
  15.  if l >= r { 
  16.   return 
  17.  } 
  18.  pivot := arr[(l+r)>>1] 
  19.  i := l - 1 
  20.  j := r + 1 
  21.  for i < j { 
  22.   for { 
  23.    i++ 
  24.    if arr[i] >= pivot { 
  25.     break 
  26.    } 
  27.   } 
  28.   for { 
  29.    j-- 
  30.    if arr[j] <= pivot { 
  31.     break 
  32.    } 
  33.   } 
  34.   if i < j { 
  35.    arr[i], arr[j] = arr[j], arr[i] 
  36.   } 
  37.  } 
  38.  quickSort(arr, l, j) 
  39.  quickSort(arr, j+1, r) 
  40.  
  41. // quickSort 取i 
  42. func quickSortI(arr []int, l int, r int) { 
  43.  if l == r { 
  44.   return 
  45.  } 
  46.  pivot := arr[(l+r+1)>>1] 
  47.  i := l - 1 
  48.  j := r + 1 
  49.  for i < j { 
  50.   for { 
  51.    i++ 
  52.    if arr[i] >= pivot { 
  53.     break 
  54.    } 
  55.   } 
  56.   for { 
  57.    j-- 
  58.    if arr[j] <= pivot { 
  59.     break 
  60.    } 
  61.   } 
  62.   if i < j { 
  63.    arr[i], arr[j] = arr[j], arr[i] 
  64.   } 
  65.  } 
  66.  quickSortI(arr, l, i-1) 
  67.  quickSortI(arr, i, r) 
  68. func main() { 
  69.  var n int 
  70.  fmt.Scan(&n) 
  71.  arr := DoBlackInput(n) 
  72.  quickSort(arr, 0, n-1) 
  73.  for _, v := range arr { 
  74.   fmt.Printf("%d ", v) 
  75.  } 

 

来源:光城内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯