目 录CONTENT

文章目录

算法|冒泡,选择,插入排序

RobKing
2022-08-20 / 0 评论 / 0 点赞 / 60 阅读 / 703 字

冒泡,选择,插入排序

//冒泡排序
//从小到大排序
func bubbleSort(arr []int) {
    m := len(arr)
    //m-1趟
    for i := 0; i < m-1; i ++ {
        //每一趟比较的次数 m - 1 - i 表示需要比较的次数
        for j := 0; j < m - 1 - i; j ++ {
            //左边比右边大 需要交换
            if arr[j] > arr[j+1] {
                arr[j], arr[j+1] = arr[j+1], arr[j]
            }
        }
    }
}

冒泡排序的时间复杂度是 O(n^2)

//选择排序
//算法思想:每次选择除当前元素之外最小的元素替换当前元素,使得最后从小到大排序
//怎么选择?用下标 如果之后元素小于当前元素更新下标,交换
func selectSort(arr []int) {
    var index int
    for i := 0; i < len(arr)-1; i ++ {
        //保存当前元素的下标
        index = i
        //从之后的元素选择最小的元素进行交换
        for j := i+1; j < len(arr); j ++ {
            if arr[j] < arr[index] {
                //如果下标为j的值 小  保存下标j
                index = j
            }
        }
        //交换下标i和index (j) 的值
        arr[i], arr[index] = arr[index], arr[i]
    }
}

选择排序的时间复杂度是 O(n^2)

//插入排序
//算法思想:遍历数组,将数组中的每个元素插入到正确的位置
//所以直接从第二个元素开始,先备份当前值,然后不断和之前的元素值进行比较,如果小于,将其右移动,直到插入正确的位置
for insertionSort(arr []int) {
    for i := 1; i < len(arr); i ++ {
        //备份当前值
    temp := arr[i]
    //移动左边 比当前元素大的
    j := i - 1
    for ;j >= 0 && arr[j] > temp; j -- {
        arr[j + 1] = arr[j]
    }
    //插入该元素
    arr[j+1] = temp
    }
}

插入排序的时间复杂度是 O(n^2)

//希尔排序
//算法思想:首先它把较大的数据集合分割成若干个小组(逻辑上分组),然后对每一个小组分别进行插入排序,此时,插入排序所作用的数据量比较小(每一个小组),插入的效率比较高
func shellSort(arr []int) {
    m := len(arr)
    //进行分组,一开始为数组的一半,之后每次减半
    for gap:=m/2; gap>0; gap /= 2 {
        //对一个分组进行排序
        for i:=gap; i<m; i++ {
            insertRightPosition(arr, gap, i)
        }
    }
}

func insertRightPosition(arr []int, gap, i int) {
    //类似于插入排序
    inserted := arr[i]
    j := i-gap
    for ;j>=0 && arr[j]>inserted; j -= gap {
        arr[j+gap] = arr[j]
    }
    //这时候的 j+gap 下标的元素是 左边的元素
    arr[j+gap] = inserted
}
func insertSort(nums []int) []int {
	for i := 1; i < len(nums); i ++ {
		// 保留当前值
		tmp := arr[i]
		// 和前面的值比较,插入正确的位置
		j := i - 1
		for ;j >= 0 && nums[j] > tmp; j -- {
			nums[j + 1] = nums[j]
		}
		nums[j + 1] = tmp
	}
}
0

评论区