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