版权声明:本文为博主原创文章,未经博主同意不得转载。 https://blog.csdn.net/caihongshijie6/article/details/26156065
一、算法思想描写叙述
归并排序:先递归分解序列,然后在合并有序序列。其过程描写叙述例如以下:每次输出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("
");
}
int main(){
int temp[maxn];
createReverseArr();
printArr();
mergeSort(arr,0,maxn-1,temp);
// MergeSort(arr,maxn);
printArr();
}