Guest User

Untitled

a guest
Feb 17th, 2019
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.43 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4. "fmt"
  5. "math/rand"
  6. "time"
  7. // "os"
  8. // "os/signal"
  9. )
  10.  
  11. const (
  12. num = 100000
  13. rangeNum = 100000
  14. )
  15.  
  16. func main() {
  17. randSeed := rand.New(rand.NewSource(time.Now().Unix() + time.Now().UnixNano()))
  18. var buf []int
  19. for i := 0; i < num; i++ {
  20. buf = append(buf, randSeed.Intn(rangeNum))
  21. }
  22. t := time.Now()
  23. //冒泡排序
  24. // maopao(buf)
  25. // 选择排序
  26. // xuanze(buf)
  27. // 插入排序
  28. // charu(buf)
  29. //希尔排序
  30. // xier(buf)
  31. //快速排序
  32. // kuaisu(buf)
  33. // 归并排序
  34. // guibing(buf)
  35. // 堆排序
  36. duipai(buf)
  37.  
  38. // fmt.Println(buf)
  39. fmt.Println(time.Since(t))
  40.  
  41. //等待退出
  42. // c := make(chan os.Signal, 1)
  43. // signal.Notify(c, os.Interrupt, os.Kill)
  44. // <-c
  45. // fmt.Println("Receive ctrl-c")
  46. }
  47.  
  48. // 冒泡排序
  49. func maopao(buf []int) {
  50. times := 0
  51. for i := 0; i < len(buf)-1; i++ {
  52. flag := false
  53. for j := 1; j < len(buf)-i; j++ {
  54. if buf[j-1] > buf[j] {
  55. times++
  56. tmp := buf[j-1]
  57. buf[j-1] = buf[j]
  58. buf[j] = tmp
  59. flag = true
  60. }
  61. }
  62. if !flag {
  63. break
  64. }
  65. }
  66. fmt.Println("maopao times: ", times)
  67. }
  68.  
  69. // 选择排序
  70. func xuanze(buf []int) {
  71. times := 0
  72. for i := 0; i < len(buf)-1; i++ {
  73. min := i
  74. for j := i; j < len(buf); j++ {
  75. times++
  76. if buf[min] > buf[j] {
  77. min = j
  78. }
  79. }
  80. if min != i {
  81. tmp := buf[i]
  82. buf[i] = buf[min]
  83. buf[min] = tmp
  84. }
  85. }
  86. fmt.Println("xuanze times: ", times)
  87. }
  88.  
  89. // 插入排序
  90. func charu(buf []int) {
  91. times := 0
  92. for i := 1; i < len(buf); i++ {
  93. for j := i; j > 0; j-- {
  94. if buf[j] < buf[j-1] {
  95. times++
  96. tmp := buf[j-1]
  97. buf[j-1] = buf[j]
  98. buf[j] = tmp
  99. } else {
  100. break
  101. }
  102. }
  103. }
  104. fmt.Println("charu times: ", times)
  105. }
  106.  
  107. // 希尔排序
  108. func xier(buf []int) {
  109. times := 0
  110. tmp := 0
  111. length := len(buf)
  112. incre := length
  113. // fmt.Println("buf: ", buf)
  114. for {
  115. incre /= 2
  116. for k := 0; k < incre; k++ { //根据增量分为若干子序列
  117. for i := k + incre; i < length; i += incre {
  118. for j := i; j > k; j -= incre {
  119. // fmt.Println("j: ", j, " data: ", buf[j], " j-incre: ", j-incre, " data: ", buf[j-incre])
  120. times++
  121. if buf[j] < buf[j-incre] {
  122. tmp = buf[j-incre]
  123. buf[j-incre] = buf[j]
  124. buf[j] = tmp
  125. } else {
  126. break
  127. }
  128. }
  129. // fmt.Println("middle: ", buf)
  130. }
  131. // fmt.Println("outer: ", buf)
  132. }
  133. // fmt.Println("outer outer: ", buf, " incre: ", incre)
  134.  
  135. if incre == 1 {
  136. break
  137. }
  138. }
  139. // fmt.Println("after: ", buf)
  140. fmt.Println("xier times: ", times)
  141. }
  142.  
  143. // 快速排序
  144. func kuaisu(buf []int) {
  145. kuai(buf, 0, len(buf)-1)
  146. }
  147.  
  148. func kuai(a []int, l, r int) {
  149. if l >= r {
  150. return
  151. }
  152. i, j, key := l, r, a[l] //选择第一个数为key
  153. for i < j {
  154. for i < j && a[j] > key { //从右向左找第一个小于key的值
  155. j--
  156. }
  157. if i < j {
  158. a[i] = a[j]
  159. i++
  160. }
  161.  
  162. for i < j && a[i] < key { //从左向右找第一个大于key的值
  163. i++
  164. }
  165. if i < j {
  166. a[j] = a[i]
  167. j--
  168. }
  169. }
  170. //i == j
  171. a[i] = key
  172. kuai(a, l, i-1)
  173. kuai(a, i+1, r)
  174. }
  175.  
  176. //归并排序
  177. func guibing(buf []int) {
  178. tmp := make([]int, len(buf))
  179. merge_sort(buf, 0, len(buf)-1, tmp)
  180. }
  181.  
  182. func merge_sort(a []int, first, last int, tmp []int) {
  183. if first < last {
  184. middle := (first + last) / 2
  185. merge_sort(a, first, middle, tmp) //左半部分排好序
  186. merge_sort(a, middle+1, last, tmp) //右半部分排好序
  187. mergeArray(a, first, middle, last, tmp) //合并左右部分
  188. }
  189. }
  190.  
  191. func mergeArray(a []int, first, middle, end int, tmp []int) {
  192. // fmt.Printf("mergeArray a: %v, first: %v, middle: %v, end: %v, tmp: %v\n",
  193. // a, first, middle, end, tmp)
  194. i, m, j, n, k := first, middle, middle+1, end, 0
  195. for i <= m && j <= n {
  196. if a[i] <= a[j] {
  197. tmp[k] = a[i]
  198. k++
  199. i++
  200. } else {
  201. tmp[k] = a[j]
  202. k++
  203. j++
  204. }
  205. }
  206. for i <= m {
  207. tmp[k] = a[i]
  208. k++
  209. i++
  210. }
  211. for j <= n {
  212. tmp[k] = a[j]
  213. k++
  214. j++
  215. }
  216.  
  217. for ii := 0; ii < k; ii++ {
  218. a[first+ii] = tmp[ii]
  219. }
  220. // fmt.Printf("sort: buf: %v\n", a)
  221. }
  222.  
  223. // 堆排序
  224. func duipai(buf []int) {
  225. temp, n := 0, len(buf)
  226.  
  227. for i := (n - 1) / 2; i >= 0; i-- {
  228. MinHeapFixdown(buf, i, n)
  229. }
  230.  
  231. for i := n - 1; i > 0; i-- {
  232. temp = buf[0]
  233. buf[0] = buf[i]
  234. buf[i] = temp
  235. MinHeapFixdown(buf, 0, i)
  236. }
  237. }
  238.  
  239. func MinHeapFixdown(a []int, i, n int) {
  240. j, temp := 2*i+1, 0
  241. for j < n {
  242. if j+1 < n && a[j+1] < a[j] {
  243. j++
  244. }
  245.  
  246. if a[i] <= a[j] {
  247. break
  248. }
  249.  
  250. temp = a[i]
  251. a[i] = a[j]
  252. a[j] = temp
  253.  
  254. i = j
  255. j = 2*i + 1
  256. }
  257. }
Add Comment
Please, Sign In to add comment