这是我参与「第五届青训营 」伴学笔记创作活动的第 15 天
排序算法是非常常用的一种算法,是最常用的算法之一,下面总结几种常用的排序算法。
冒泡排序
冒泡排序是一种简单的排序算法,其基本思想是反复遍历要排序的数列,每次比较相邻的两个元素,如果它们的顺序不符合要求就交换它们,直到整个数列都有序为止。
以下是使用golang实现冒泡排序的代码:
func bubbleSort(arr []int) {
n := len(arr)
for i := 0; i < n-1; i++ {
for j := 0; j < n-i-1; j++ {
if arr[j] > arr[j+1] {
// 交换arr[j]和arr[j+1]的位置
arr[j], arr[j+1] = arr[j+1], arr[j]
}
}
}
}
在这个实现中,我们首先获取数组的长度,然后使用两个嵌套的for循环来遍历数组。外层循环从第一个元素开始遍历到倒数第二个元素,内层循环从第一个元素开始遍历到当前未排序部分的最后一个元素。在内层循环中,我们比较相邻的元素,如果它们的顺序不符合要求就交换它们的位置。当内层循环结束时,最大的元素会被移到未排序部分的最后一个位置。这样,每次外层循环都会将一个元素移动到它的最终位置,直到整个数组都有序为止。
插入排序
插入排序是一种简单的排序算法,其基本思想是将待排序的元素逐个插入已经排好序的部分中,形成新的有序序列。
以下是使用golang实现插入排序的代码:
func insertionSort(arr []int) {
n := len(arr)
for i := 1; i < n; i++ {
key := arr[i]
j := i - 1
for j >= 0 && arr[j] > key {
arr[j+1] = arr[j]
j--
}
arr[j+1] = key
}
}
在这个实现中,我们首先获取数组的长度,然后使用一个for循环遍历数组,从第二个元素开始到最后一个元素。对于每个待排序的元素,我们将它存储在变量key中,然后使用一个内层循环将它插入已经排好序的部分中。内层循环从当前元素的前一个元素开始向前遍历,直到找到第一个小于或等于key的元素,然后将key插入到这个元素的后面。当内层循环结束时,整个数组的前i个元素都已经排好序了。
插入排序是一种稳定的排序算法,其时间复杂度为O(n^2),但是当待排序的数组已经基本有序时,插入排序的效率非常高,接近O(n)。