归并排序是一种稳定排序,时间复杂度O(nlogn),空间复杂度O(n)。
那么已经非常高效的归并排序是否还能再优化呢?当然是可以的,timsort就是在归并排序上改进的一种高级排序方式,现在广泛运用在如python,Java等主流语言中。timsort是高效的,完整的算法是相当复杂的,因此我这里主要根据timsort提两个优化思路。
先附上归并排序的算法:
//num -- 待排序的数组
//start -- 排序的起点
//end -- 排序数组最后一位
void MergeSort(int *nums, int start, int end) {
//判断起点是否小于终点
if (end-start<2) {
return;
}
//进行分割操作
int mid = (start + end) / 2;
MergeSort(nums, start, mid);
MergeSort(nums, mid , end);
//归并两个子列
Merge(nums, start, mid, end);
}
1、避免无用的归并
看例子:
{1,2} {7,8}
当两个子序列已经排好序的状态时,我们就不必再做无用的合并操作,此时加一句判断即可,如下:
void MergeSort(int *nums, int start, int end) {
if (end-start<2) {
return;
}
int mid = (start + end) / 2;
MergeSort(nums