1.合并排序简介
合并排序是采用分治法的一个非常典型的应用。
该排序算法将两个或两个以上的有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的,然后再把有序子序列合并为整体有序序列。
2.算法性能分析
(1)时间复杂度
①最好时间复杂度为
②最差时间复杂度为
平均时间复杂度为
(2)空间复杂度
空间复杂度为
3.算法图解
设原始数组为[7,0,2,5,1,9,8,6]
4.C/C++实现
#include <iostream>
#include <algorithm>
using namespace std;
void merge(int Array[],int left,int middle,int right)//两个子序列合并
{
int len1=middle-left+1;//计算左边数组长度
int len2=right-middle;//计算右边数组长度
int *L=new int[len1+1];
int *R=new int[len2+1];
for(int i=0;i<len1;i++)
L[i]=Array[left+i];//将Array数组中mid左边数组赋给L[]
for(int j=0;j<len2;j++)
R[j]=Array[middle+1+j];//将Array数组中mid右边数组赋给R[]
L[len1]=R[len2]=INT_MAX;//#define INT_MAX 2147483647
int i=0,j=0;
for(int k=left;k<=right;k++)
{
if (L[i]<R[j])
{
Array[k]=L[i];//若左边数小于右边数则把左侧L[]值赋给Array
i++;
}
else
{
Array[k]=R[j];//否则把右侧R[]值赋给Array
j++;
}
}
}
void mergeSort(int Array[], int left, int right)
{
if (left<right)
{
int middle;
middle=(right+left)/2;
mergeSort(Array,left,middle);//排序左边部分
mergeSort(Array,middle+1,right);//排序右边部分
merge(Array,left,middle,right);//左右两边合并拼接即可
}
}
int main()
{
int a[] = {7,0,2,5,1,9,8,6};
int num = 8;
mergeSort(a,0,num-1);
for(int i=0;i<num;i++)
cout<<a[i]<<" ";//输出0 1 2 5 6 7 8 9
return 0;
}
运行结果为:
本文到此就结束了,如有错误,欢迎大家批评指正。