排序
1. 插入排序
直接插入排序 (内存6.3MB,用时 944ms)
插排的思想是排序的排到底i个的时候,保证前面下标是0~(i-1)的序列是有序的。
func sortArray(nums []int) []int {
for i,v := range nums {
if i == 0{
continue
}
// 左子序列判断+挪位子
for j := i-1 ; j>=0 ; j--{
if v < nums[j]{
nums[j],nums[j+1] = nums[j+1], nums[j]
}else{
break
}
}
}
return nums
}时间复杂度 O(n^2) 空间复杂度O(1)
折半(二分)插入排序 (内存6.3MB,用时452ms)
直接插入排序是边查边挪,折半插入排序是先用二分查找找到插入点,然后统一挪位置
比较次数降至 O(nlog2(n))
时间复杂度 O(n^2) 空间复杂度O(1)
希尔排序 (内存6.3MB,用时28ms)
以步长为单位,将下表为i的与i+d的元素比较,若i元素大于i+d元素,则交换,每一趟之后再将步长缩小为一般再次进行比较。
时间复杂度 O(n^2) 空间复杂度 O(1)
2. 交换排序
冒泡排序
从后往前或者两两比较交换次序,每一趟把最小的放在队首,或者将最大的队尾,每一趟之后将排序元素数减一进行多次交换 (小切片代码还行,大的直接超出时间限制)
时间复杂度 O(n^2) 空间复杂度O(1)
快速排序
先找个枢纽元素,默认为下标为0的元素,然后数组头尾设置标记点和枢纽元素比,找到2个元素,前面的比枢纽大,后面的比枢纽小,就交换。每一趟下来,枢纽元素的左侧都是比枢纽元素小的,右侧都是比枢纽元素大的,当头尾标记移动到相同位置时,此位置即为枢纽的位置。然后再对左右两个子序列进行递归。
递归方法:(内存6.4MB,用时24ms)
时间复杂度 O(nlogn) 空间复杂度O(1)
3.选择排序
简单选择排序 每趟一次交换 (内存6.4MB,用时1456 ms)
每一趟都和第 (i+1) 个到第 n 个比较,在和把最小的元素和i交换。
堆排序 (内存6.4MB,用时28ms)
4.归并排序
归并排序 (执行用时 32 ms,内存消耗 7.4 MB)
时间复杂度 O(nlogn)
空间复杂度 O(n)
Tips:
归并排序不是原地排序算法。
最后更新于