自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Go數(shù)據(jù)結(jié)構(gòu)與算法基礎(chǔ)之快速排序

開發(fā) 后端 算法
最近打算重拾算法,從0跟著acwing走一遍,順便用Go實(shí)現(xiàn)一下。今天的目標(biāo)是學(xué)習(xí)快排,使用Go寫。 學(xué)習(xí)自acwing。

[[411577]]

本文轉(zhuǎn)載自微信公眾號「光城」,作者 lightcity 。轉(zhuǎn)載本文請聯(lián)系光城公眾號。

最近打算重拾算法,從0跟著acwing走一遍,順便用Go實(shí)現(xiàn)一下。

今天的目標(biāo)是學(xué)習(xí)快排,使用Go寫。

學(xué)習(xí)自acwing。

輸入:

  1. 1 3 2 

輸出:

  1. 1 2 3 

快排思想:

1.定義pivot

2.根據(jù)pivot劃分區(qū)間

3.遞歸子問題

pivot可以隨機(jī)選擇,例如:arr[l]、arr[r] 等等。

當(dāng)遞歸時(shí)有兩種選擇,一種是取j,需要保證pivot不取arr[r],防止死循環(huán)。

本文實(shí)現(xiàn)用這個(gè):

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

另一種是取i,需要保證pivot不取arr[l],防止死循環(huán),同時(shí)不可以使用 arr[(l+r)>>1]這種,得向上取整,例如:arr[(l+r+1)>>1]。

本文實(shí)現(xiàn)用這個(gè):

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

最后補(bǔ)充幾個(gè)go知識。

1.輸入

go中處理輸入,使用fmt.Scan,將地址傳進(jìn)去,這里我實(shí)現(xiàn)了一個(gè)函數(shù),后面可以直接復(fù)用。

  1. // DoBlackInput 處理空格輸入為數(shù)組 
  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.交換

如何快速交換兩個(gè)元素。

  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 處理空格輸入為數(shù)組 
  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.  } 

 

責(zé)任編輯:武曉燕 來源: 光城
相關(guān)推薦

2023-03-07 08:02:07

數(shù)據(jù)結(jié)構(gòu)算法數(shù)列

2023-03-02 08:15:13

2023-03-10 08:07:39

數(shù)據(jù)結(jié)構(gòu)算法計(jì)數(shù)排序

2023-04-27 09:13:20

排序算法數(shù)據(jù)結(jié)構(gòu)

2023-03-13 10:08:31

數(shù)據(jù)結(jié)構(gòu)算法

2021-10-18 11:29:48

奇偶排序數(shù)組數(shù)據(jù)結(jié)構(gòu)算法

2023-10-30 08:31:42

數(shù)據(jù)結(jié)構(gòu)算法

2019-03-29 09:40:38

數(shù)據(jù)結(jié)構(gòu)算法前端

2021-06-09 09:06:52

Go語言算法

2023-03-06 08:10:52

數(shù)據(jù)結(jié)構(gòu)算法數(shù)據(jù)

2021-04-15 09:36:44

Java數(shù)據(jù)結(jié)構(gòu)算法

2021-03-23 08:33:22

Java數(shù)據(jù)結(jié)構(gòu)算法

2020-08-12 08:30:20

數(shù)據(jù)結(jié)構(gòu)算法

2020-10-30 09:56:59

Trie樹之美

2022-09-21 07:57:33

二叉搜索樹排序二叉樹

2022-09-26 07:56:53

AVL算法二叉樹

2020-12-31 05:31:01

數(shù)據(jù)結(jié)構(gòu)算法

2020-10-21 14:57:04

數(shù)據(jù)結(jié)構(gòu)算法圖形

2022-03-07 09:42:21

Go快速排序

2017-06-16 09:22:22

數(shù)據(jù)結(jié)構(gòu)算法鏈表
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號