排序——归并排序

来源:互联网 发布:虚拟主机linux 编辑:程序博客网 时间:2024/05/11 13:25

归并排序

归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序,称为二路归并。

归并操作(merge),也叫归并算法,指的是将两个顺序序列合并成一个顺序序列的方法。
如设有数列{6,202,100,301,38,8,1}
初始状态:6,202,100,301,38,8,1
第一次归并后:{6,202},{100,301},{8,38},{1},比较次数:3;
第二次归并后:{6,100,202,301},{1,8,38},比较次数:4;
第三次归并后:{1,6,8,38,100,202,301},比较次数:4;
归并操作的工作原理如下:
第一步:申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
第二步:设定两个指针,最初位置分别为两个已经排序序列的起始位置
第三步:比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
重复步骤3直到某一指针超出序列尾
将另一序列剩下的所有元素直接复制到合并序列尾

算法分析

平均时间复杂度:O(nlog2n)

空间复杂度:O(n)  (用于存储有序子序列合并后有序序列)


算法实现

<span style="font-size:14px;">#include <stdio.h>#include <stdlib.h>//用于实现两个有序的序列合并为一个有序的序列int Merger(int a[],int low,int high,int tmp[]){   int mid=(low+high)/2,i=0,m=mid+1;   while(low<=mid&&m<high)   {       if(a[low]<a[m])       {            tmp[i]=a[low];            low++;       }       else{            tmp[i]=a[m];            m++;       }       i++;   }   while(low<=mid)   {        tmp[i++]=a[low++];   }   while(m<=high)   {    tmp[i++]=a[m++];   }   return 0;}//递归实现排序int mergesort(int a[],int low,int high,int tmp[]){    int mid;    if(low<high)    {        mid=(low+high)/2;        mergesort(a,low,mid,tmp);        mergesort(a,mid+1,high,tmp);        Merger(a,low,high,tmp);    }    return 0;}int main(){    int a[10]={3,7,9,10,56,2,34,45,53,90},c[10],i;mergesort(a,0,9,c);for(i=0;i<10;i++){printf("%d\t",c[i]);}    return 0;}</span>




0 0
原创粉丝点击