C语言实现归并排序

来源:互联网 发布:李炎恢php第一季讲义 编辑:程序博客网 时间:2024/06/07 13:42

归并排序
时间复杂度:O(nlogn)
空间复杂度:O(n)
稳定性:稳定
实现原理:采用分治法(Divide and Conquer)将已有序的子序列合并,得到完全有序的序列,即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,也叫二路归并。
代码实现:采用递归方法实现

#include<stdio.h>#include<stdlib.h>#define MAXSIZE 10//实现归并并把最后结果保存到listl中void Merging(int *listl,int listl_Size,int *listr,int listr_Size){    int i,j,k,n;    int tmp[MAXSIZE]; //临时数组存放排序好的数据    i=j=k=0;   /*i是指向listl的下标 ,j是指向listr的下标*/    while(i<listl_Size && j<listr_Size)    {        //实现排序,小的先存放        if(listl[i]<listr[j])        {            tmp[k++]=listl[i++];        }        else        {            tmp[k++]=listr[j++];        }    }    //把最大的依次追加在最后    while(i<listl_Size)    {        tmp[k++]=listl[i++];    }       while(j<listr_Size)    {        tmp[k++]=listl[j++];    }   //把临时数组的数据存放到listl中    for(n=0;n<listl_Size+listr_Size;n++)    {        listl[n]=tmp[n];    }}void Merge_sort(int a[],int len){    /*      只有当len大于1时才递归,否则结束递归    */    if(len>1)    {      int *listl=a;//定义指针指向数组左半部分      int  listl_Size=len/2;      int *listr=a + len/2;//定义指针指向数组右半部分      int listr_Size=len - listl_Size;      Merge_sort(listl,listl_Size);      Merge_sort(listr,listr_Size);     //实现归并     Merging(listl,listl_Size,listr,listr_Size);   }}//测试代码  int main(int argc, char const *argv[])  {     int array[]={123,56,89,2,65,3};     Merge_Sort(array,6);    int i;      for( i = 0 ; i < 6 ; i++)       {         printf("%d ",array[i]);       }        return 0;    }
1 0
原创粉丝点击