11.排序-冒泡、插入、选择

插入排序和冒泡排序的时间复杂度相同,都是 O(n2),我们更倾向于使用插入排序算法。

原因:xxx

如何分析一个排序算法:

1执行效率

(1)最好情况、最坏情况、平均情况时间复杂度

(2)时间复杂度的系数、常数 、低阶

小规模数据,同阶比较,系数和常数也很重要

(3)比较次数和交换(或移动)次数

2.内存消耗

原地排序,空间复杂度是o(1)。

3.稳定性

如果待排序的序列中存在值相等的元素,经过排序之后,相等元素之间原有的先后顺序不变。

冒泡排序(BubbleSort)

对相邻的两个元素进行比较,是否满足交换。一次冒泡会让至少一个元素移动到它应该在的位置,重复 n 次,就完成了 n 个数据的排序工作。

func BubbleSort(arry []int ) []int{
    if len(arry) <= 1{
    return arry
    }

    for i:= 0; i < len(arry)-1; i++{//趟数
        for j := 0; j < len(arry) - 1 -i; j ++{//每趟比较的次数
            if arry[j] > arry[j+1]{
                arry [j], arry[j+1] = arry[j+1], arry[j]
            }
        } 
    }
    return arry
}

冒泡排序是原地排序,稳定性排序,时间复杂度最好O(n),最坏O(n2)

插入排序(InsertSort)

往一个有序的数组里插入一个新的数据,插入到应该在位置,继续保持数组有序。

动态地往有序集合中添加数据,我们可以通过这种方法保持集合中的数据一直有序。

数组中分为已排序的区间未排序的区间,初始已排序区间只有一个元素,就是数组的第一个元素。插入算法的核心思想是取未排序区间中的元素,在已排序区间中找到合适的插入位置将其插入,并保证已排序区间数据一直有序。重复这个过程,直到未排序区间中元素为空,算法结束。

插入排序是原地排序,稳定性排序,时间复杂度最好O(n),最坏O(n2)

func InsertSort(arr []int) {
	for i := 1; i < len(arr); i++ {//第一个元素不需要排
		for j := i; j > 0; j-- {//有序集合的元素个数j
			if arr[j] < arr[j-1] {
				arr[j-1], arr[j] = arr[j], arr[j-1]
			}
		}
	}

	fmt.Println(arr)
}

选择排序(SelectionSort)

和插入排序类似,从未排序的区间取最新的数据,插入到已排序的区间。

时间复杂度O(n2)

是一种不稳定的排序,每次找剩余元素的最小值,和前面的元素交换位置,破坏了稳定性。

发布了127 篇原创文章 · 获赞 24 · 访问量 13万+

猜你喜欢

转载自blog.csdn.net/Linzhongyilisha/article/details/100106913