数组归并排序算法的一种实现

来源:互联网 发布:nba奇葩数据 编辑:程序博客网 时间:2024/05/16 06:29

 归并排序算法是分治思想的一种实现。主要思想是,把一个数组分成两个子数组,分别排好序,再合并到一起,成为一个排好序的数组。具体实现的时候用到了递归,递归的先分再治。

 

 

 

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

 

/*合并两个排序好的数组*/
void merge(int* array, int* a, const int start, const int mid, const int end)
{
int p=start;
int p1=start;
int p2=mid+1;

 

while((p1<=mid)&&(p2<=end))
{
    if(array[p1]<array[p2])
    {
      a[p++]= array[p1++];
    }
    else
    {
      a[p++]= array[p2++];
    }
}

 

while(p1<=mid)
{
 a[p++]=array[p1++];
}

 

while(p2<=end)
{
 a[p++]=array[p2++];
}

 

for(p=start;p<=end;p++)
{
 array[p]=a[p];
}

}

 

/*归并排序的主例程*/
void merge_sort(int* array, int* a, const int start, const int end)
{
 int mid=(start+end)/2;
 if(start<end)
 {
  merge_sort(array,a,start,mid);
  merge_sort(array,a,mid+1,end);
  merge(array,a,start,mid,end);
 }
 else
 {
  return;
 }
}

 

/*测试例程*/

int main()
{
int i=0;
int a[10]={9,8,7,6,5,4,3,2,1,0};

 

/*打印归并排序后的数组*/
printf("Before merge sorting:/n");
for(i=0;i<10;i++)
{
 printf("%d ",a[i]);
}
printf("/n");

 

int* b=(int*)malloc(sizeof(a));/*临时数组,空间大小和要排序的数组相同*/
merge_sort(a,b,0,9);/*排序*/
free(b);/*释放临时空间*/

 

/*打印归并排序后的数组*/
printf("After merge sorting:/n");
for(i=0;i<10;i++)
{
 printf("%d ",a[i]);
}
printf("/n");

 

/*防止控制台马上退出*/
scanf("%d",&i);
return 0;