合并排序

 

合并排序利用的是分治原理

 

合并排序的主要思想是:把两个已经排序好的序列进行合并,成为一个排序好的
序列。例如:13579 2468这两个序列,各自都是排好序的,然后我们进行合并,成为123456789这样一个
排好序的序列。

 

所以第一步是分解子序列,将其分解成一个个单一的子序列,一直分解到每个序列只有一个为止

 

第二步,合并已排好的序列,注意设置一个无限大的数,这样可以再排序的时候比较比较方便,不用去计算len的长度,这是一个小小的技巧

 

代码如下:

 

#include <stdio.h>
#include <stdlib.h>

#define MAX 1000

void MergeSort(int data[],int num);
void Merge(int data[],int p,int q,int r);//0,4,9
void MergeSorts(int data[],int p,int r);

int main()
{
 int nData[10] = {10,4,1,7,8,6,2,3,7,9};    //创建10个数据,测试
 MergeSort(nData, 10);        //调用插入排序

 for (int i = 0; i < 10; ++i)        
 {
  printf("%d ", nData[i]);
 }

 printf("/n");
 system("puase");

 return 0;
}

void MergeSort(int data[],int num)
{
 MergeSorts(data,0,num-1);
}

void MergeSorts(int data[],int p,int r)
{
 if(p>=r)
  return;
 else
 {
  int q=(p+r)/2;
  MergeSorts(data,p,q);
  MergeSorts(data,q+1,r);
  Merge(data,p,q,r);
 }
}

void Merge(int data[],int p,int q,int r)//0,4,9
{
 int len1=q-p;//4
 int len2=r-q;//5
 int *data1=new int[len1+2];
 int *data2=new int[len2+1];

 for(int i=0;i<=len1;i++)
 {
  data1[i]=data[p+i];
 }
 data1[i]=MAX;
 
 for(i=0;i<=len2-1;i++)
 {
  data2[i]=data[q+1+i];
 }
 data2[i]=MAX;

 i=0;
 int j=0;

 while(p<=r)
 {
  if(data1[i]<data2[j])
  {
   data[p]=data1[i];
   i++;
   p++;
  }
  else
  {
   data[p]=data2[j];
   j++;
   p++;
  }
 }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值