一、算法思想描述
归并排序:先递归分解序列,然后在合并有序序列。其过程描述如下:每次输出A、B这两个有序序列中的最小的一个。
二、算法分析
时间复杂度:最差、平均、最好的时间复杂度都是O(nlgn);
空间复杂度:O(n)
稳定性: 稳定
三、算法实现
/* * mergesort.cpp * * Created on: 2014年5月18日 * Author: pc */ #include <iostream> #include <cstdio> using namespace std; const int maxn = 10; int arr[maxn]; /** * 合并有序序列 */ void mergeArr(int arr[],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(arr[i] <= arr[j]){//去两个序列中的最小值。这里要用<=,否则就不是稳定排序了 temp[k++] = arr[i++]; }else{ temp[k++] = arr[j++]; } } //以下两个循环用于处理某一个序列没有值的情况 while(i <= m ){ temp[k++] = arr[i++]; } while(j <= n){ temp[k++] = arr[j++]; } //更新原序列 for(i = 0 ; i < k ;++i){ arr[first+i] = temp[i]; } } /** * 归并排序 */ void mergeSort(int arr[],int first,int last,int temp[]){ if(first < last){//如果还没分割到只剩一个元素,就不断的分割 int mid = (first+last)/2; mergeSort(arr,first,mid,temp);//达到左边有序的状态 mergeSort(arr,mid+1,last,temp);//达到右边有序的状态 mergeArr(arr,first,mid,last,temp);//归并 } } //void MergeSort(int arr[],int n){ // int* temp = new int[n]; // mergeSort(arr,0,n-1,temp); //} void createReverseArr(){ int i = 0; for(i = 0 ; i < maxn ; ++i){ arr[i] = maxn - i; } } void printArr(){ int i; for(i = 0 ; i < maxn ; ++i){ printf("%d " , arr[i]); } printf("\n"); } int main(){ int temp[maxn]; createReverseArr(); printArr(); mergeSort(arr,0,maxn-1,temp); // MergeSort(arr,maxn); printArr(); }
原文:http://blog.csdn.net/hjd_love_zzt/article/details/26156065