继续复习排序,归并排序来啦。
归并排序的思想是:将若干个有序的序列进行合并成一个有序的序列。
如何将两个有序的序列合并为一个有序的序列,是我们的归并排序的一个问题。我们知道这个问题很是简单。
直接Code:
合并两个有序数组。引入一个sorted辅助数组。
void merge(int *a, int *sorted, int s, int m, int t)
{
cout << "s = " << s << " m = " << m << " t = " << t << endl;
int index1 = s, index2 = m + 1, index = 0;
while(index1 <= m && index2 <= t){
if(a[index1] <= a[index2]){
sorted[index ++] = a[index1];
++ index1;
}
else {
sorted[index ++] = a[index2];
++ index2;
}
}
while(index1 <= m){
sorted[index ++] = a[index1];
index1 ++;
}
while(index2 <= t){
sorted[index ++] = a[index2];
index2 ++;
}
for(int i = 0; i < index; ++ i){
a[s + i] = sorted[i];
}
}
这样就很简单的,把两个有序的序列合并为了一个有序的序列。时间复杂度为O(n)。
然后就是我们的重头戏了。
把数组分割,然后合并的操作。
Code:
void merge_sort(int *a, int *sorted, int s, int t)
{
if(s < t){
int m = (s + t) / 2;
merge_sort(a, sorted, s, m);
merge_sort(a, sorted, m + 1, t);
merge(a, sorted, s, m, t);
}
}
最优,最坏,平均时间复杂度为O(n)。
如果我们对于一个序列的复杂度没有很清楚的认识的话,我们可以假设这个待排序的序列为正好顺序,或正好逆序。