码迷,mamicode.com
首页 > 编程语言 > 详细

归并排序-学习笔记

时间:2017-07-28 14:10:55      阅读:179      评论:0      收藏:0      [点我收藏+]

标签:scanf   合并   一个   排序数组   回溯   str   学习笔记   存储空间   printf   

归并排序的主要思想:它的主要思想就是分而治之的思想,首先,他是把一个待排序数组分为两个待排序为一个小组的若干个数组,这是分,然后把这些个待排序的小数组两两合并,合并为一个排好序的数组,这就是治。归并排序是稳定排序。

代码如下:

#include<cstdio>
int temp[100];//把缓存数组定义为全局变量,避免每次回溯都开辟新的存储空间
void MergeSort(int a[],int left,int right){
    int l=left,r=right,mid=(l+r)/2,i=mid+1;//定义变量,left是数组的左边界,right是数组的右边界,i是第二个待排数组的第一个数
    if(l<=r){ //递归,直到剩两个元素为止,注意这里不能写为l<=r 这样会死循环
        MergeSort(a,l,mid);
        MergeSort(a,mid+1,r);

        int k=0;//初始化缓存数组的下角标为0

        while(l<=mid&&i<=right){//当左右待排数组都有元素时,从小到大依次放入缓存数组
            if(a[l]<a[i]){
                temp[k++]=a[l++];
            }
            else{
                temp[k++]=a[i++];
            }
        }
        while(l<=mid){//当只有左待排数组有元素时,直接放入缓存数组
            temp[k++]=a[l++];
        }
        while(i<=right){//当只有右待排数组有元素时,直接放入缓存数组
            temp[k++]=a[i++];
        }
        for(i=left,k=0;i<=right;i++,k++){//把缓存数组中的元素copy到原数组中
            a[i]=temp[k];
        }
    }
}
int main(){
    int a[20],n;
    scanf("%d",&n);
    for(int i=0; i<n; i++)
    {
        scanf("%d",&a[i]);
    }
    MergeSort(a,0,n-1);
    for(int i=0; i<n; i++)
    {
        printf("%d ",a[i]);
    }
}

 

归并排序-学习笔记

标签:scanf   合并   一个   排序数组   回溯   str   学习笔记   存储空间   printf   

原文地址:http://www.cnblogs.com/zhsbk/p/7249689.html

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