Golang各种排序

76 阅读1分钟

归并排序

func mergeSort(nums []int) []int {
   n := len(nums)
   if n <= 1 {
      return nums                // 注意判断退出条件
   }

   mid := n / 2
   left := mergeSort(nums[:mid])
   right := mergeSort(nums[mid:]) // 注意这里的条件,不是mid+1

   return merge(left, right)
}
func merge(left []int, right []int) []int {
   n := len(left)
   m := len(right)
   nums := make([]int, 0, n+m)

   i, j := 0, 0

   for i < n || j < m {
      if i == n {
         nums = append(nums, right[j])
         j++
      } else if j == m {
         nums = append(nums, left[i])
         i++
      } else if left[i] < right[j] {
         nums = append(nums, left[i])
         i++
      } else {
         // left[i]>=right[j]
         nums = append(nums, right[j])
         j++
      }
   }
   return nums
}
func main() {
   nums := []int{2, 5, 7, 2, 3, 4, 1, 9, 2}
   fmt.Println(mergeSort(nums))

   nums = []int{2, 5, 7, 2, 3, 4, 1, 9, 2, 15}
   fmt.Println(mergeSort(nums))

   nums = []int{0, 2, 5, 7, 2, 3, 4, 1, 9, 2}
   fmt.Println(mergeSort(nums))

   nums = []int{0, 2, 5, 7, 2, 3, 4, 1, 9, 2, 15}
   fmt.Println(mergeSort(nums))

   nums = []int{0, 1, 2, 3}
   fmt.Println(mergeSort(nums))
}

快速排序

func quickSort(nums []int, low int, high int) {
   if low >= high {
      return
   }

   value := nums[low] // 基准值,期望在它左边的都小于等于它,在它右边的都大于等于它
   i, j := low, high
   for i < j {
      for i < j && nums[j] > value {
         j--
      }
      nums[i], nums[j] = nums[j], nums[i]
      for i < j && nums[i] <= value {
         i++
      }
      nums[i], nums[j] = nums[j], nums[i]
   }
   quickSort(nums, low, i-1)
   quickSort(nums, i+1, high)
}
func main() {
   nums := []int{2, 5, 7, 2, 3, 4, 1, 9, 2}
   quickSort(nums, 0, len(nums)-1)
   fmt.Println(nums)

   nums = []int{2, 5, 7, 2, 3, 4, 1, 9, 2, 15}
   quickSort(nums, 0, len(nums)-1)
   fmt.Println(nums)

   nums = []int{0, 2, 5, 7, 2, 3, 4, 1, 9, 2}
   quickSort(nums, 0, len(nums)-1)
   fmt.Println(nums)

   nums = []int{0, 2, 5, 7, 2, 3, 4, 1, 9, 2, 15}
   quickSort(nums, 0, len(nums)-1)
   fmt.Println(nums)

   nums = []int{0, 1, 2, 3}
   quickSort(nums, 0, len(nums)-1)
   fmt.Println(nums)
}