合并排序利用的是分治原理
合并排序的主要思想是:把两个已经排序好的序列进行合并,成为一个排序好的
序列。例如: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++;
}
}
}