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:插入排序比冒泡排序的优势在哪里?
冒泡排序交换需要三次赋值,插入排序交换只需要一次赋值,开销插入小,插入排序的优化空间大
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。