归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。
复杂度分析: 归并排序的效率是比较高的,设数列长为N,将数列分开成小数列一共要logN步,每步都是一个合并有序数列的过程,时间复杂度可以记为O(N),故一共为O(N*logN)。因为归并排序每次都是在相邻的数据中进行操作,所以归并排序在O(N*logN)的几种排序方法(快速排序,归并排序,希尔排序,堆排序)也是效率比较高的。
示例代码如下:
#include<iostream>
using namespace std;
void merge(int arr[],int left,int mid,int right,int temp[]);//并
void mergeSort(int arr[],int left,int right,int temp[]);//分
bool MergeSuccess(int arr[],int n);
int main(){
int arr[] = {324,5,87,234,89,243,89,245,78,341,56,234};
if(MergeSuccess(arr,12));
{
for(int i = 0;i< 12;i++)
{
cout<<arr[i]<<" ";
}
cout<<endl;
}
return 0;
}
void merge(int arr[],int left,int mid,int right,int temp[]){
int i = left,m = mid,j = mid + 1,r = right;
int k = 0;
while(i <= m && j <= r){
if(arr[i] <= arr[j]){
temp[k++] = arr[i++];
}
else{
temp[k++] = arr[j++];
}
}
while(i <= m)
{
temp[k++] = arr[i++];
}
while(j <= r)
{
temp[k++] = arr[j++];
}
for(int i=0;i<k;i++)
arr[left+i] = temp[i];
}
void mergeSort(int arr[],int left,int right,int temp[]){
if(arr == nullptr)
return ;
if(left < right){
int mid = (left + right)/2;
mergeSort(arr,left,mid,temp);
mergeSort(arr,mid+1,right,temp);
merge(arr,left,mid,right,temp);
}
}
bool MergeSuccess(int arr[],int n){
if(arr == nullptr)
return false;
int *temp = new int[n];
if(temp == nullptr)
return false;
mergeSort(arr,0,n-1,temp);
return true;
}
运行结果如下: