一、归并排序
稳定排序
步骤:
1、把待排序序列一分为二
2、递归的对每一个子序列进行排序
3、合并两个有序序列
合并:比较两个排好序的子序列首部的数字(即最小的),找到原序列最小的值,去掉这个最小值,继续比较两个子序列首部的,依次找到序列第二小第三小......
c++代码:
//复制vector vector<int> vec_assign(vector<int> seq, int begin, int end) { vector<int> assign_seq; for(int i=begin; i<=end; ++i) assign_seq.push_back(seq[i]); return assign_seq; } //归并排序 void MergeSort(vector<int>& sequence, int begin, int end) { int len = end - begin + 1; //当前子序列长度 if(len>=2) { /*****1、分成两个子序列******/ int half = ceil(float(len)/2) + begin - 1; /*****2、递归的对每个子序列进行排序******/ MergeSort(sequence, begin, half); MergeSort(sequence, half+1, end); /*****3、合并两个子序列*******/ /*****即:将sequence[begin~half]和sequence[half+1~end]合并成sequence[begin~end]*****/ vector<int> seq1 = vec_assign(sequence, begin,half); vector<int> seq2 = vec_assign(sequence, half+1, end); int index1 = 0, index2 = 0; for(int i=begin; i<=end; ++i) if(index1 == seq1.size()) sequence[i] = seq2[index2++]; else if(index2 == seq2.size()) sequence[i] = seq1[index1++]; else if(seq1[index1]>seq2[index2]) sequence[i] = seq2[index2++]; else sequence[i] = seq1[index1++]; } }
空间复杂度:除去序列本身,合并子序列时需要两个临时vector:seq1和seq2
由于seq1和seq2是局部变量,每次合并结束后即被销毁,所以整个排序过程只需要一个seq1和一个seq2
seq1和seq2的长度等于子序列长度即初始序列长度n的1/(2^x)即n/a, a>=1
S(n) = θ(n)
时间复杂度:每次两个子序列合并时for循环次数为n/(2^x)即θ(n);
第二步递归地对每个子序列排序的递归次数为lgn(以2为底)。
时间复杂度 = lgn x θ(n) x 常数
T(n) = θ(nlgn)