归并:
申请一段内存空间,大小为两个排好顺序序列长度之和,该块内存空间用来存放合并后序列,然后遍历两个序列,根据约定选取合适的数字放到空间,直到两个序列归并成一个序列为止。
void merge(int array[], int p, int q, int h)
{
int fb,fe; //first_begin first_end
int sb,se; //second_begin second_end
int *temp = (int *)malloc((h-p+1)*sizeof(int)); //store memory
if(!temp)
{
printf("ERROR: malloc failure!");
return ;
}
fb=p;
fe=q;
sb=q+1;
se=h;
int i=0;
while((fb<=fe)&&(sb<=se))
temp[i++]=(array[fb]<=array[sb])?array[fb++]:array[sb++];
while(fb<=fe)
temp[i++]=array[fb++];
while(sb<=se)
temp[i++]=array[sb++];
i=0;
for(;i<(h-p+1);++i)
array[p+i]=temp[i];
free(temp);
}
排序的思想
1. 将序列每相邻两个数字进行归并操作(merge), 排序后每个序列包含两个元素
2. 将上述序列再次归并,每个序列包含四个元素
3. 重复步骤2,直到所有元素排序完毕
实现如下
void merge_sort(int array[], int first, int last)
{
int mid;
if(first<last)
{
mid = (first+last)/2;
merge_sort(array, first, mid);
merge_sort(array, mid+1,last);
merge(array,first,mid,last);
}
}
实现完成,用个例子看看结果
#include <stdio.h>
#include <stdlib.h>
void merge(int array[], int p, int q, int h)
{
int fb,fe; //first_begin first_end
int sb,se; //second_begin second_end
int *temp = (int *)malloc((h-p+1)*sizeof(int)); //store memory
if(!temp)
{
printf("ERROR: malloc failure!");
return ;
}
fb=p;
fe=q;
sb=q+1;
se=h;
int i=0;
while((fb<=fe)&&(sb<=se))
temp[i++]=(array[fb]<=array[sb])?array[fb++]:array[sb++];
while(fb<=fe)
temp[i++]=array[fb++];
while(sb<=se)
temp[i++]=array[sb++];
i=0;
for(;i<(h-p+1);++i)
array[p+i]=temp[i];
free(temp);
}
void merge_sort(int array[], int first, int last)
{
int mid = 0;
if(first<last)
{
mid = (first+last)/2;
merge_sort(array, first, mid);
merge_sort(array, mid+1,last);
merge(array,first,mid,last);
}
}
int main()
{
int array[]={5,4,3,2,6,43,9,76,98,7,8};
int len=sizeof(array)/sizeof(int);
merge_sort(array,0,len-1);
int i=0;
for(;i<len;++i)
printf("%d ", array[i]);
printf("\n");
return 0;
申请一段内存空间,大小为两个排好顺序序列长度之和,该块内存空间用来存放合并后序列,然后遍历两个序列,根据约定选取合适的数字放到空间,直到两个序列归并成一个序列为止。
void merge(int array[], int p, int q, int h)
{
int fb,fe; //first_begin first_end
int sb,se; //second_begin second_end
int *temp = (int *)malloc((h-p+1)*sizeof(int)); //store memory
if(!temp)
{
printf("ERROR: malloc failure!");
return ;
}
fb=p;
fe=q;
sb=q+1;
se=h;
int i=0;
while((fb<=fe)&&(sb<=se))
temp[i++]=(array[fb]<=array[sb])?array[fb++]:array[sb++];
while(fb<=fe)
temp[i++]=array[fb++];
while(sb<=se)
temp[i++]=array[sb++];
i=0;
for(;i<(h-p+1);++i)
array[p+i]=temp[i];
free(temp);
}
排序的思想
1. 将序列每相邻两个数字进行归并操作(merge), 排序后每个序列包含两个元素
2. 将上述序列再次归并,每个序列包含四个元素
3. 重复步骤2,直到所有元素排序完毕
实现如下
void merge_sort(int array[], int first, int last)
{
int mid;
if(first<last)
{
mid = (first+last)/2;
merge_sort(array, first, mid);
merge_sort(array, mid+1,last);
merge(array,first,mid,last);
}
}
实现完成,用个例子看看结果
#include <stdio.h>
#include <stdlib.h>
void merge(int array[], int p, int q, int h)
{
int fb,fe; //first_begin first_end
int sb,se; //second_begin second_end
int *temp = (int *)malloc((h-p+1)*sizeof(int)); //store memory
if(!temp)
{
printf("ERROR: malloc failure!");
return ;
}
fb=p;
fe=q;
sb=q+1;
se=h;
int i=0;
while((fb<=fe)&&(sb<=se))
temp[i++]=(array[fb]<=array[sb])?array[fb++]:array[sb++];
while(fb<=fe)
temp[i++]=array[fb++];
while(sb<=se)
temp[i++]=array[sb++];
i=0;
for(;i<(h-p+1);++i)
array[p+i]=temp[i];
free(temp);
}
void merge_sort(int array[], int first, int last)
{
int mid = 0;
if(first<last)
{
mid = (first+last)/2;
merge_sort(array, first, mid);
merge_sort(array, mid+1,last);
merge(array,first,mid,last);
}
}
int main()
{
int array[]={5,4,3,2,6,43,9,76,98,7,8};
int len=sizeof(array)/sizeof(int);
merge_sort(array,0,len-1);
int i=0;
for(;i<len;++i)
printf("%d ", array[i]);
printf("\n");
return 0;
}