归并排序-学习笔记
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了归并排序-学习笔记相关的知识,希望对你有一定的参考价值。
归并排序的主要思想:它的主要思想就是分而治之的思想,首先,他是把一个待排序数组分为两个待排序为一个小组的若干个数组,这是分,然后把这些个待排序的小数组两两合并,合并为一个排好序的数组,这就是治。归并排序是稳定排序。
代码如下:
#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]); } }
以上是关于归并排序-学习笔记的主要内容,如果未能解决你的问题,请参考以下文章