(插入排序;时间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