1. 2路归并排序
给两个已经排好序的长度相等的数组a,b将排序结果记录到数组C中。
算法:取两个下标i,j分别记录数组a,和b的下标,每次那次a[i]和b[j]作比较,如果a[i]>b[j],则j++,否则i++,如果某个下标超出数组长度,则结束循环,另一个数组将其后的元素依次补到数组C后。
void p_merge(int a[],int b[],int c[],int len)
{
int i=0,j=0;
int temp;
int t=0;
if(a[0]>b[0])
{
temp=b[0];
c[t++]=temp;
j=1;
}
else
{
temp=a[0];
c[t++]=temp;
i=1;
}
while(i<len && j<len)
{
if(a[i]>b[j])
{
c[t++]=b[j++];
}
else
{
c[t++]=a[i++];
}
}
if(i==len)
{
for(int tt=j;tt<len;tt++)
{
c[t++]=b[j++];
}
}
else if(j==len)
{
for(int tt=i;tt<len;tt++)
{
c[t++]=b[i++];
}
}
}
2.归并排序(递归)
算法:将一个无序的数组进行分割,
申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
设定两个指针,最初位置分别为两个已经排序序列的起始位置
比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
重复步骤3直到某一指针达到序列尾
将另一序列剩下的所有元素直接复制到合并序列尾
#include <stdio.h>
#include <stdlib.h>
void MergeSort(int array[], int first, int last);
void Merge(int array[], int p, int q, int r);
void main()
{
int array[]={3,1,6,9,2,4,8,3};
MergeSort(array,0,7);
for(int i=0;i<8;i++)
{
printf("%d ",array[i]);
}
}
void MergeSort(int array[], int first, int last)
{
int mid = 0;
if(first<last)
{
mid = (first+last)/2;
MergeSort(array, first, mid);
MergeSort(array, mid+1,last);
Merge(array,first,mid,last);
}
}
void Merge(int array[], int p, int q, int r)
{
int i,k;
int begin1,end1,begin2,end2;
int* temp = (int*)malloc((r-p+1)*sizeof(int));
begin1= p;
end1 = q;
begin2 = q+1;
end2 = r;
k = 0;
while((begin1 <= end1)&&( begin2 <= end2))
{
if(array[begin1] < array[begin2])
{
temp[k] = array[begin1];
begin1++;
}
else
{
temp[k] = array[begin2];
begin2++;
}
k++;
}
while(begin1<=end1 || begin2<=end2)
{
if(begin1<=end1)
{
temp[k++] = array[begin1++];
}
if(begin2<=end2)
{
temp[k++] = array[begin2++];
}
}
for (i = 0;i <=(r - p); i++)
array[p+i] = temp[i];
free(temp);
}