自己的算法确实是蒟蒻无比,只好抽时间再来回顾一下。
1. 插入排序:
输入:数组A; 输出:排序后的A
for i=1 to len(A)-1
temp = A[i];
//对第 i(i>=0) 个元素,其前i-1个元素以及排序完毕;
//寻找第 i 元素的位置,并且挪动那些应该后移的
for j= i-1 to 0 && A[j] > temp:
A[j+1] = A[j];
j - -;
// j+1 位置就是 temp的坑了
A[j+1] = temp
插入排序比较简单,复杂度两套循环O(n2)
2. 合并排序:
分而治之的思想,先把大的分成小的,然后再合并结果。
输入:数组A; 输出:排序后的A
Merge-sort(A, s, e):
if s==e: return; // 已经只有一个元素了,数组直接返回,结束条件
m = (s+e)/2; //取中点
Merge-sort(A, s, m); //前半部分
Merge-sort(A, m+1, e); //处理后半部分
Merge(A, s, e); //合并结果
Merge(A, s, e):
m=(s+e)/2;
L = A[s:m]
R = A[m+1:e]
L[last] = R[last] = max(A) +1 or other
for k=s to e:
if L[i] < R[j]: A[k]=L[i]; i++; //因为此处,可以将LR的最后元素设为一个默认达不到的max,k转到e时循环结束
else: A[k]=R[j]; j++;
合并排序二分处理,每次只处理当前一半,约为lg(n),总的时间复杂度为O(n*lg(n))