(插入排序;时间A:N*logN,B:N*logN,E:N*logN;空间N;稳定) /* 归并排序内部缓存法 可以把空间复杂度降到O(1); 归并排序原地归并法 也可以把空间复杂度降到O(1)但是时间复 杂度会变成O(N^2) */ //合并解 void merge(int* p, int first,int mid,int end) { int *temp = new int[end - first + 1](); int left_first = first; int left_end = mid; int right_first = mid + 1; int right_end = end; int k = 0; //依次比较两个数组的大小 将较小的放入临时数组 for (k = 0; left_first <= left_end&&right_first <= right_end; k++) { if (p[left_first] <= p[right_first]) { temp[k] = p[left_first]; left_first++; } else { temp[k] = p[right_first]; right_first++; } } //左边剩余元素 复制到temp中 if (left_first <= left_end) { for (int j = left_first; j <= left_end; j++) { temp[k] = p[j]; k++; } } //右边剩余元素 复制到temp中 if (right_first <= right_end) { for (int j = right_first; j <= right_end; j++) { temp[k] = p[j]; k++; } } //拷贝到原来的数组中 for (int i = 0; i <end-first+1; i++) { p[first+i] = temp[i]; } delete []temp; } //归并 void merge_sort(int* p,int first,int end) { int mid = 0; if (first<end) { mid = (first + end )/2; //分的阶段 将大数组分解成小数组 merge_sort(p, first, mid); merge_sort(p, mid + 1, end); merge(p, first, mid, end);//治的阶段 将小数组合并成大数组 } }
原文:https://www.cnblogs.com/zhang-liubai/p/15125911.html