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

开发 后端 算法
最近打算重拾算法,从0跟着acwing走一遍,顺便用Go实现一下。今天的目标是学习快排,使用Go写。 学习自acwing。

[[411577]]

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

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

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

学习自acwing。

输入:

  1. 1 3 2 

输出:

  1. 1 2 3 

快排思想:

1.定义pivot

2.根据pivot划分区间

3.递归子问题

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.  } 

 

责任编辑:武晓燕 来源: 光城
相关推荐

2023-03-07 08:02:07

数据结构算法数列

2023-03-10 08:07:39

数据结构算法计数排序

2023-03-02 08:15:13

2023-03-13 10:08:31

数据结构算法

2023-04-27 09:13:20

排序算法数据结构

2019-03-29 09:40:38

数据结构算法前端

2021-10-18 11:29:48

奇偶排序数组数据结构算法

2023-10-30 08:31:42

数据结构算法

2021-03-23 08:33:22

Java数据结构算法

2021-06-09 09:06:52

Go语言算法

2017-06-16 09:22:22

数据结构算法链表

2020-12-31 05:31:01

数据结构算法

2023-03-06 08:10:52

数据结构算法数据

2021-04-15 09:36:44

Java数据结构算法

2022-03-07 09:42:21

Go快速排序

2021-04-16 09:40:52

Java数据结构算法

2020-10-12 11:48:31

算法与数据结构

2020-08-12 08:30:20

数据结构算法

2009-08-03 17:38:12

排序算法C#数据结构

2021-06-08 10:41:00

Go语言算法
点赞
收藏

51CTO技术栈公众号