码迷,mamicode.com
首页 > 其他好文 > 详细

排序算法之归并排序

时间:2014-05-22 07:29:44      阅读:250      评论:0      收藏:0      [点我收藏+]

标签:style   blog   class   c   code   tar   

一、算法思想描述

      归并排序:先递分解序列,然后在合有序序列。其过程描述如下:每次输出A、B这两个有序序列中的最小的一个。

     bubuko.com,布布扣


二、算法分析

     时间复杂度:最差、平均、最好的时间复杂度都是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();

}



  

排序算法之归并排序,布布扣,bubuko.com

排序算法之归并排序

标签:style   blog   class   c   code   tar   

原文地址:http://blog.csdn.net/hjd_love_zzt/article/details/26156065

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!