image.png
    快排
    1.选取基准值tag:选取第一个元素为基准值(每次递归调用的基准值不等
    2.从0向后查找到比tag大的数,否则i++
    3.从n向前查找到比tag小的数,否则j—
    4.交换两个数
    5.全部交换后此时i==j,递归调用,继续比较i位置两侧位置

    1. //第一种方式,递归传入分割后的数组
    2. func quicksort(s []int){
    3. if len(s)<=0 {
    4. return
    5. }
    6. tag:=s[0]
    7. i:=0
    8. j:=len(s)-1
    9. for i<j {
    10. for s[j]>tag&&i<j {
    11. j--
    12. }
    13. for s[i]<tag&&i<j {
    14. i++
    15. }
    16. s[i],s[j]=s[j],s[i]//交换
    17. }
    18. quicksort(s[:i])
    19. quicksort(s[i+1:])
    20. }
    1. //第二种方式,递归传入原数组
    2. func quicksort(s []int,start int,end int){
    3. if start >=end{
    4. return
    5. }
    6. tag:=s[start]
    7. i:=start
    8. j:=end
    9. for i<j {
    10. for s[j]>tag&&i<j {
    11. j--
    12. }
    13. for s[i]<tag&&i<j {
    14. i++
    15. }
    16. s[i],s[j]=s[j],s[i]//交换
    17. }
    18. quicksort(s,start,i-1)
    19. quicksort(s,i+1,end)
    20. }
    1. // QuickSort
    2. package main
    3. import (
    4. "fmt"
    5. "math/rand"
    6. "time"
    7. )
    8. func swap(a int, b int) (int, int) {
    9. return b, a
    10. }
    11. func partition(aris []int, begin int, end int) int {
    12. pvalue := aris[begin]
    13. i := begin
    14. j := begin + 1
    15. for j < end {
    16. if aris[j] < pvalue {
    17. i++
    18. aris[i], aris[j] = swap(aris[i], aris[j])
    19. }
    20. j++
    21. }
    22. aris[i], aris[begin] = swap(aris[i], aris[begin])
    23. return i
    24. }
    25. func quick_sort(aris []int, begin int, end int) {
    26. if begin+1 < end {
    27. mid := partition(aris, begin, end)
    28. quick_sort(aris, begin, mid)
    29. quick_sort(aris, mid+1, end)
    30. }
    31. }
    32. func rand_array(aris []int, lent int) {
    33. for i := 0; i < lent; i++ {
    34. r := rand.New(rand.NewSource(time.Now().UnixNano()))
    35. aris[i] = r.Intn(1000)
    36. }
    37. }
    38. func main() {
    39. intas := []int{0, 0, 0, 0, 7, 20, 4, 77, 1, 22}
    40. rand_array(intas, 10)
    41. fmt.Println(intas)
    42. quick_sort(intas, 0, 10)
    43. fmt.Println(intas)
    44. }

    选择排序

    1. package main
    2. import "fmt"
    3. func main() {
    4. numbers := []int{6, 2, 7, 5, 8, 9}
    5. SelectSort(numbers)
    6. fmt.Println(numbers)
    7. }
    8. func SelectSort(values []int) {
    9. length := len(values)
    10. if length <= 1 {
    11. return
    12. }
    13. for i := 0; i < length; i++ {
    14. min := i // 初始的最小值位置从0开始,依次向右
    15. // 从i右侧的所有元素中找出当前最小值所在的下标
    16. for j := length - 1; j > i; j-- {
    17. if values[j] < values[min] {
    18. min = j
    19. }
    20. }
    21. //fmt.Printf("i:%d min:%d\n", i, min)
    22. // 把每次找出来的最小值与之前的最小值做交换
    23. values[i], values[min] = values[min], values[i]
    24. //fmt.Println(values)
    25. }
    26. }