golang实现冒泡排序的三种方法

今天重温排序的一些简单方法-冒泡排序,了解排序的同学们应该知道,冒泡排序是一种朴素的排序方法,通常我们都会用2个for-loop搞定,第一层遍历每个元素,第二层则遍历前面的元素,第一层每次循环后,都会把当次遍历的最大值移动到数组的后面位置,数组后几位即成升序的状态。

根据冒泡排序的方法论,整理出以下关于冒泡排序的方法:

  • 通常冒泡排序
  • 递归的冒泡排序
  • 带剪枝的冒泡排序

下面是代码:

package main

import (
	"fmt"
	"math/rand"
	"time"
)

func main()  {
	nums := genRandomIntSlice(10)
	fmt.Println(nums)
	nums1 := make([]int, 10)
	copy(nums1, nums)
	nums2 := make([]int, 10)
	copy(nums2, nums)
	nums3 := make([]int, 10)
	copy(nums3, nums)

	// 1.general bubble sort
	fmt.Printf("before sort, nums1: %v\n", nums1)
	bubbleSort1(nums1)
	fmt.Printf("after sort, nums1: %v\n", nums1)
	// 2.bubble sort with recursive
	fmt.Printf("before sort, nums2: %v\n", nums2)
	bubbleSort2(nums2)
	fmt.Printf("after sort, nums2: %v\n", nums2)
	// 3.bubble sort with prune
	fmt.Printf("before sort, nums3: %v\n", nums3)
	bubbleSort3(nums3)
	fmt.Printf("after sort, nums3: %v\n", nums3)
}

func genRandomIntSlice(cnt int) []int {
	rand.Seed(time.Now().UnixNano())
	nums := make([]int, cnt)
	for i := 0; i < 10; i++ {
		nums[i] = rand.Intn(100)
	}

	return nums
}

// general bubble sort
func bubbleSort1(nums []int)  {
	if len(nums) < 2 {
		return
	}

	for i := 0; i < len(nums); i++ {
		for j := 0; j < len(nums)-i-1; j++ {
			if nums[j] > nums[j+1] {
				nums[j], nums[j+1] = nums[j+1], nums[j]
			}
		}
	}
}

// bubble sort with recursive
func bubbleSort2(nums []int)  {
	if len(nums) < 2 {
		return
	}

	bubbleSort_(nums, len(nums)-1)
}

func bubbleSort_(nums []int, n int)  {
	if n < 2 {
		return
	}

	for i := 0; i < n; i++ {
		if nums[i] > nums[i+1] {
			nums[i], nums[i+1] = nums[i+1], nums[i]
		}
	}

	bubbleSort_(nums, n-1)
}

// bubble sort with prune
func bubbleSort3(nums []int)  {
	length := len(nums)
	for i := 0; i < length; i++ {
		flag := true
		for j := 0; j < length-i-1; j++ {
			if nums[j] > nums[j+1] {
				flag = false
				nums[j], nums[j+1] = nums[j+1], nums[j]
			}
		}

		if flag { break }
	}
}

posted on 2023-02-01 16:24  进击的davis  阅读(429)  评论(0编辑  收藏  举报

导航