ITfeng

 

排序----归并排序

归并排序的前提是:归并前两个数组是有序的。归并排序的思路是先分成两半使用归并排序,然后比较大小,从小到大复制到一个零时数组中去;如果比较后,一方有剩余,那么将剩下的复制到临时数组,最后将排序好的数组拷贝回原数组。

归并排序的时间复杂度是:nlogn

#include<stdio.h>
#include<stdlib.h>
#define N 1000000
int array[N];
int temp[N];
void init_array(int a[],int n);
void print_array(int a[],int n);
void guibing_sort(int a[],int start,int end);
void Guibing_sort(int a[],int n);

int main()
{
 init_array(array,N);
 Guibing_sort(array,N);
 print_array(array,N); 
}
void init_array(int a[],int n)
{
 int i;
 for(i=0;i<n;i++)
  a[i]=rand()%1000; 
}
void print_array(int a[],int n)
{
 int i;
 for(i=0;i<n;i++)
  printf("%d\n",a[i]); 
}
void guibing_sort(int a[],int start,int end)
{ int i,j,mid,k=0;
 if(start>=end) return ;
 mid=(start+end)/2;
 guibing_sort(a,start,mid);
 guibing_sort(a,mid+1,end); 
 i=start;
 j=mid+1;
 while(i<=mid && j<=end)//比较从小到大放置
 {
  if(a[i]<=a[j])
  {
   temp[k++]=a[i++];
  }
  else
  {
   temp[k++]=a[j++];
  }
  
 }
 while(i<=mid)
  temp[k++]=a[i++];
 while(j<=end)
  temp[k++]=a[j++];//如果有剩余则复制
 for(i=0;i<k;i++)
  a[start+i]=temp[i];//拷贝回原数组
 
}
void Guibing_sort(int a[],int n)
{
 guibing_sort(a,0,n-1); 
}

posted on 2012-04-24 16:32  ITfeng  阅读(306)  评论(0编辑  收藏  举报

导航