服务报价 | 域名主机 | 网络营销 | 软件工具| [加入收藏]
 热线电话: #
当前位置: 主页 > 开发教程 > python教程 >

归并排序

时间:2016-01-15 17:32来源:未知 作者:最模板 点击:
归并排序原理:将一个数组分成由左右两个数组,如果左右两个数组为有序数组,则合并成为一个有序数组,排序完成 过程: 将数组分成左右两个数组(此时左右两个数组是无序的,
  1. 归并排序原理:将一个数组分成由左右两个数组,如果左右两个数组为有序数组,则合并成为一个有序数组,排序完成

  2. 过程:

    • 将数组分成左右两个数组(此时左右两个数组是无序的,所有需要先对左右两个数组排序)
    • 对左右两个数组分别排序(递归)
    • 合并左右两个有序数组
  3. 实现:

    #include <stdio.h>
    #include <stdlib.h>
    
    /**
    * 合并2个有序序列
    */
    void mergeData(int *data,int start,int mid,int end)
    {
     int *r;
    
     if((r = (int *)malloc(sizeof(int) * (end - start + 1))) == NULL)
     {
         return;
     }
    
     int k = 0,leftStart = start,leftEnd = mid,rightStart = mid + 1,rightEnd = end;
    
     while(leftStart <= leftEnd && rightStart <= rightEnd)
     {//有一个序列结束了则结束比较
    
         if(*(data + leftStart) < *(data + rightStart))
         {
             *(r + k) = *(data + leftStart);
             leftStart ++;
         }
         else
         {
             *(r + k) = *(data + rightStart);
             rightStart ++;
         }
    
         k ++;
     }
    
     //将剩余的数据追加到r末尾
     while(leftStart <= leftEnd)
     {
         *(r + k) = *(data + leftStart);
         leftStart ++;
         k ++;
     }
    
     while(rightStart <= rightEnd)
     {
         *(r + k) = *(data + rightStart);
         rightStart ++;
         k ++;
     }
    
     //将合并后的数组依次存储到原数组
     int i,j;
     for(i = 0,j=start;i < k;i++,j++)
     {
         *(data + j) = *(r + i);
     }
    }
    /**
    * 归并排序
    */
    void mergeSort(int *data,int start,int end)
    {
     if(start >= end)
     {
         return;
     }
    
     //将数组分成2部分,分别排序,在合并
     int mid = (end + start)/2;//分成2个数组
     mergeSort(data,start,mid);//对左边排序
     mergeSort(data,mid + 1,end);//对右边排序
     mergeData(data,start,mid,end);//合并
    }
    void myPrint(int *data,int size)
    {
     int index;
     for(index = 0;index < size;index ++)
     {
         printf("%d,",*(data + index));
     }
    }
    int main()
    {
     int a[] = {23,12,1,90,21,80};
     mergeSort(a,0,sizeof(a)/sizeof(int) - 1);
     myPrint(a,sizeof(a)/sizeof(int));
     return 1;
    }
(责任编辑:最模板)
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
栏目列表
热点内容