C++ 归并排序

归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(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;
}

运行结果如下:


猜你喜欢

转载自blog.csdn.net/qq_29762941/article/details/80895882