第一个在最坏情况下时间复杂度为O(nlogn)的算法
用于分布式平台中处理海量数据
代码
void merge(vector<int> &vec, int lo, int mid, int hi) {
int len1 = mid - lo,len2=hi-mid,i=0,j=0,k=0;
int* A=new int[len1];
for (int i = 0; i < len1; A[i++] = vec[lo+i]);
while (i < len1 || j < len2) {
if (i < len1 && (j >= len2 || A[i] <=vec[mid + j])) vec[k++] = A[i++];
if (j < len2 && (i >= len1 || vec[mid + j] < A[i])) vec[k++] = vec[mid + j++];
}
delete[] A;
}
void mergeSort(vector<int> &vec, int lo, int hi) {
if (hi - lo < 2) return;
int mid = (hi + lo) / 2;
mergeSort(vec, lo, mid);
mergeSort(vec, mid, hi);
merge(vec,lo, mid, hi);
}
简洁版
void merge(vector<int> &vec, int lo, int mid, int hi) {
int len1 = mid - lo,len2=hi-mid,i=0,j=0,k=0;
int* A=new int[len1];
for (int i = 0; i < len1; A[i++] = vec[lo+i]);
while (i < len1 ) {
if (i < len1 && ( A[i] <=vec[mid + j])) vec[k++] = A[i++];
if ((i >= len1 || vec[mid + j] < A[i])) vec[k++] = vec[mid + j++];
}
delete[] A;
}
void mergeSort(vector<int> &vec, int lo, int hi) {
if (hi - lo < 2) return;
int mid = (hi + lo) / 2;
mergeSort(vec, lo, mid);
mergeSort(vec, mid, hi);
merge(vec,lo, mid, hi);
}