归并排序总结
程序员文章站
2022-03-24 13:53:58
...
看了关于归并排序的这篇文章之后,写个总结:
归并排序是采用分治法的典型案例。
基本思路:
将数组分成两组 A,B,如果A,B组内的数据是有序的,那么很容易将两组数组进行排序。
为了将A.B两组数据有序,那么将A,B再分成两组。依次类推,当分出来的小组只有一个数据时,
可以认为小组组内已经达到了有序,然后再合并相邻两个小组。
通过先递归的分解数列,再合并数列就完成了归并排序。
代码如下:
#include <bits/stdc++.h>
using namespace std;
//将有二个有序数列a[first...mid]和a[mid...last]合并。
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++];
else
temp[k++] = a[j++];
}
// 再将其中某个未放置完毕的数组直接放在临时保存数组后面
while (i <= m)
temp[k++] = a[i++];
while (j <= n)
temp[k++] = a[j++];
// 再将临时数组的值放置在排序数组中
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); //再将二个有序数列合并
}
}
bool MergeSort(int a[], int n)
{
// 创建一个临时数组用来保存中间结果
int *p = new int[n];
if (p == NULL)
return false;
mergesort(a, 0, n - 1, p);
delete[] p;
return true;
}
int main()
{
int b[10] = {9,8,7,6,5,4,3,2,1,0};
MergeSort(b, 10);
for(int i=0; i<10; i++)
{
printf("%d ", b[i]);
}
return 0;
}
上一篇: 排序算法三:归并排序
下一篇: C#冒泡排序原理讲解及代码块