zoukankan      html  css  js  c++  java
  • 排序算法之归并排序

    版权声明:本文为博主原创文章,未经博主同意不得转载。 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();
    
    }
    
    
    

      

查看全文
  • 相关阅读:
    内存对齐
    总结一下,一晃工作有一年了
    标准库中迭代器的关系
    反转迭代器和插入迭代器的区别
    MFC定时关机程序的实现3-最小化到托盘栏
    MFC定时关机程序的实现2-添加启动项到注册表
    MFC定时关机程序的实现1
    C++文件读写之对象的读写
    ADO之密码验证--3次错误就锁定『改进』
    ADO之密码验证--3次错误就锁定
  • 原文地址:https://www.cnblogs.com/ldxsuanfa/p/10718983.html
  • Copyright © 2011-2022 走看看