归并排序的思想:
将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。归并排序是建立在归并操作上的一种有效排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。
时间复杂度:O(nlogn)
空间复杂度:O(n)
稳定性:稳定
#include<iostream>
using namespace std;
//将有序的arr[s..m]和arr[m+1..n]归并成有序的TR[s..n];
void Merge(int arr [],int s,int m,int n)
{
int size = n - s + 1;
int * temp = new int[size]; //开辟动态数组,存放排序的值
int i = s, j = m + 1; //i是第一个序列的第一个元素,j是第二个序列的第一个元素
int k = 0;
while (i <= m && j <= n) //依次比较前后两个序列的元素大小,从小到大插入到temp中,注意插入后指向下一个元素
{
if (arr[i] < arr[j])
temp[k++] = arr[i++];
else
temp[k++] = arr[j++];
}
while (j <= n) //将没有排完的那个序列剩下所有的元素直接接到合并序列的尾部
{
temp[k++] = arr[j++];
}
while(i <= m)
{
temp[k++] = arr[i++];
}
for (int l = 0; l < size; l++) //将temp再赋值给arr数组,还原成完整的排序数组
arr[s++] = temp[l];
/*for (int i = 0; i < n; i++)
cout << arr[i] << " ";*/
}
//归并排序
void MergeSort(int arr[],int left,int right)
{
if (left == right)
return;
int mid = (left + right) / 2;
MergeSort(arr, left, mid);
MergeSort(arr, mid+1, right);
Merge(arr, left, mid, right);
}
int main()
{
//int arr[8] = { 7,8,9,12,0,1,2,6 };
//Merge(arr, 0, 3, 7);
int arr[8] = { 1,8,6,7,9,14,3,0 };
MergeSort(arr, 0, 7);
for (int i = 0; i < 8; i++)
cout << arr[i] << " ";
return 0;
}