核心思想是将已经排好序的几个链表或者数组进行合并排序。
下边是将两个有序数组进行归并的核心代码:
void Merge(vector<int>&a, vector<int> b,int i,int m,int n) {
int start = i, end = n;
int j = m+1, k = i;
cout << endl;
while (i <= m && j <=n) {
if (a[i] < a[j]) {
b[k++] = a[i++];
}
else {
b[k++] = a[j++];
}
}
while(i <= m)
b[k++] = a[i++];
while (j <= n)
b[k++] = a[j++];
for (i = start; i <= end; i++)
a[i] = b[i];
}
2.利用上边代码对整个数组进行排序。
void MergeSort(vector<int>& a,vector<int> b,int i,int j) {
if(i<j) {
int mid = (i + j) / 2;
MergeSort(a, b, i, mid);
MergeSort(a, b, mid + 1, j);
Merge(a, b, i, mid, j);
}
}
时间复杂度:O(nlogn)
两个有序数组合并复杂度O(m+n),数组递归调用O(logn),所以时间复杂度是O(nlogn)。
稳定性:归并排序是稳定的,因为两个有序数组合并的时候相对位置没有发生改变。