归并排序是一种稳定的算法,其时间复杂度保持为
O
(
n
l
o
g
n
)
O(nlog_n)
O(nlogn)。
排序思想
归并排序,就是将数列内的元素先分开,再合并。
将序列中待排序数字分为若干组,每个数字分为一组。
将若干个组两两合并,保证合并后的组是有序的。
重复第二步操作直到只剩下一组,排序完成。
设数列q: 2 3 1 5 4 6
将6个数字分为六组,每个数字为一组,则每组数列一定有序。
再将六个数组两两进行有序合并,得到:
23 15 46
…
重复归并操作,最终可得到有序数列。
核心代码
void mergesort(int low,int mid,int high)
{
int left = low; //左序列指针
int right = mid + 1; //右序列指针
int k = low; //temp数组操作指针
while (left < mid + 1 && right < high + 1) {
if (nums[left] > nums[right]) {
temp[k++] = nums[right++];
}
else {
temp[k] = nums[left];
k++;
left++;
}
}
//查看左边序列是否为空
while (left < mid + 1)
{
temp[k++] = nums[left++];
}
//查看右边序列是否为空
while (right < high + 1)
{
temp[k++] = nums[right++];
}
//移动回原数组
for (int i = low; i <= high; i++)
{
nums[i] = temp[i];
}
}