1:剖析排序算法的三个维度都是什么?
答:执行效率(工夫、空间复杂度),内存耗费,算法稳定性
2:从算法执行效率这个维度登程从哪三个方面进行掂量?
答:最好最坏和均匀复杂度、工夫复杂度系数、常数和低阶、比拟和替换、挪动次数。
3:原地排序是什么概念?
答:排序时,除带排序元素组内部不占用额定的空间,即为原地排序。
4:什么事排序的稳定性、稳定性排序算法和不稳定性排序算法的区别在哪里?
答:对于雷同元素,在排序前后地位不变,即为稳固算法。稳固与不稳固的区别在于雷同元素在排序前后的地位是否变动。
5:数组的满序度、有序度、逆序度概念是什么?如何计算?
答:有序度是指有序元素的个数,逆序度是指反序元素对的个数,满序度是指在排序后续元素对的个数,两者之和就是满序度。
6:冒泡排序的实现思路是怎么样的,请实现冒泡排序算法?
答:相邻元素进行比拟,有序则不替换,反序则替换,始终到最初一个元素,这样能够保障一个满足条件的元素被挪动到最终地位。下一轮从第二个元素开始,直到倒数第二个元素。
代码:
BubleSort.go
package main
import ("fmt")
func main() {var arr [5]int = [5]int{1,3,2,5,2}
var arrLength = len(arr)
for i:=0;i< arrLength;i++ {
flag := false
// 下一轮从第二个元素开始,直到倒数第二个元素
for j:=1;j<arrLength - 1 -i ;j++ {if(arr[j] > arr[j+1]) {arr[j],arr[j+1] = arr[j+1],arr[j]
flag = true
}
}
if(!flag) {break}
}
fmt.Println(arr)
}
7:冒泡排序的为什么是原地排序算法,为什么是稳固排序算法,最坏最好,均匀工夫复杂度各是多少?
答:不占用额定空间。雷同元素比拟不替换则稳固,替换则不稳固。最好 O(N), 最坏 O(n2), 均匀 O(N2)
8:插入排序的实现思路是怎么样的,请实现插入排序算法?
答:将待排序元素组分成排序区和未排序区,将未排序区元素一次插入已排序区,并保障已排序区始终有序,晓得未排序区为空
InsertSort.go
package main
import "fmt"
func main() {arr := [5]int{5,4,3,2,1}
arrLength := len(arr)
for i:= 1;i< arrLength;i++ {tempValue := arr[i]
j := i - 1
for ;j>=0;j-- { // 和曾经排序的做比拟
if(arr[j] > tempValue) { // 右边大于左边
arr[j+1] = arr[j] // 则右移
}
}
arr[j+1] = tempValue
}
fmt.Println(arr)
}
9:插入排序为什么是原地排序算法,最好最坏,均匀复杂度各是多少?
答:未应用额定空间排序。最好 O(n), 均匀 O(n2)
10:抉择排序的实现思路是怎么样的,请实现抉择排序算法?
答:将待排序元素组分成已排序区和未排序区,在未排序区找满足条件的元素插入以排序区的最初,直到未排序区为空。
package main
import "fmt"
func main() {arr := [5]int{5,4,3,2,1}
arrLength := len(arr)
for i:=0;i<arrLength;i++ {
min := i
for j:=i+1;j<arrLength;j++ {if(arr[j] < arr[min]) {min = j}
}
arr[i],arr[min] = arr[min],arr[i]
}
fmt.Println(arr)
}
11:抉择排序的为什么是原地排序算法, 为什么不是稳固排序算法, 最好最坏, 均匀工夫复杂度各是多少?
答:抉择未应用额定空间。元素在插入已排序区时会导致未排序区的第一个和满足条件元素进行替换,替换可能导致雷同元素地位变动。最好 O(n2), 最坏 O(n2), 均匀 O(n2)。
12:插入排序比冒泡排序的劣势在哪里?
冒泡排序替换须要三次赋值,插入排序替换只须要一次赋值,开销插入小,插入排序的优化空间大