归并排序
归并排序的可视化图:
归并排序的概念:归并排序是创建在归并操作上的一种有效的排序算法,效率为O(n log n)。1945年由约翰·冯·诺伊曼首次提出。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用,且各层分治递归可以同时进行。
归并排序的算法描述如下:
- 迭代法:
- 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
- 设定两个指针,最初位置分别为两个已经排序序列的起始位置
- 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
- 重复步骤3直到某一指针到达序列尾
- 将另一序列剩下的所有元素直接复制到合并序列尾
- 递归法:
- 原理如下(假设序列共有n个元素):
- 将序列每相邻两个数字进行归并操作,形成 {\displaystyle floor(n/2)} floor(n/2)个序列,排序后每个序列包含两个元素
- 将上述序列再次归并,形成 {\displaystyle floor(n/4)} floor(n/4)个序列,每个序列包含四个元素
- 重复步骤2,直到所有元素排序完毕
- 迭代法:
归并排序的代码实现:
void Mergearray(int[] a, int first, int mid, int last, int[] temp)
{
int i = first, j = mid + 1;
int m = mid, n = last;
int k = 0;
while (i <= m && j <= n)
{
if (a[i] <= a[j])
{
temp[k++] = a[i++];
//Record(temp);
}
else {
temp[k++] = a[j++];
//Record(temp);
}
}
while (i <= m) {
temp[k++] = a[i++];
//Record(temp);
}
while (j <= n) {
temp[k++] = a[j++];
//Record(temp);
}
for (i = 0; i < k; i++)
a[first + i] = temp[i];
}
void MergeSort(int[] a, int first, int last, int[] temp)
{
if (first < last)
{
int mid = (first + last) / 2;
MergeSort(a, first, mid, temp);
MergeSort(a, mid + 1, last, temp);
Mergearray(a, first, mid, last, temp);
}
}
void MergeSort(int[] arr)
{
int[] temp = new int[arr.Length];
MergeSort(arr, 0, n - 1, temp);
}
- 归并排序的复杂度:
- 时间复杂度
$O(nlog{n})$
- 最优时间复杂度
$O(n)$
- 平均时间复杂度
$O(nlog{n})$
- 空间复杂度
$O(n)$
- 时间复杂度
如有错误,欢迎指出。
email:dxmdxm1992#gmail.com
blog: csdn magicdavid.top