归并排序
采用分而治之的思想 采用递归 分成小部分 (对半分) 治:将正确答案对在一起
图片网上找的
void mergesort(int a[],int n)==递归分==
{
if(n>1)
{
int *list1=a;
int list1_size=n/2;
int *list2=a+n/2;
int list2_size=n-list1_size;
mergesort(list1,list1_size);==左半部分==
mergesort(list2,list2_size);==右半部分==
merging(list1,list1_size,list2,list2_size);==左右两边正确部分合==**治之**
}
}
void merging(int *list1,int list1_size,int *list2,int list2_size)
{
int temp[5];
int i=0;int j=0;int k=0;
while( i<list1_size&&j<list2_size )
{
if( list1[i]<list2[j] )
{
temp[k++]=list1[i++];
}
else
{
temp[k++]=list2[j++];
}
}
while( i<list1_size )
{
temp[k++]=list1[i++];
}
while( j<list2_size )
{
temp[k++]=list2[j++];
}
int m;
for(m=0;m<(list1_size+list2_size);m++)
{
list1[m]=temp[m];
}
}
迭代
void mergesort(int a[],int n)
{
int i,left_min,left_max,right_min,right_max;
int *temp=(int *)malloc(n*sizeof(int)) ;
int next;
for(i=1;i<n;i=i*2)//步长
{
for(left_min=0;left_min<n-i;left_min=right_max)
{
right_min = left_max=left_min+i;//每次选两组
right_max=left_max+i;
if( right_max>n )
{
right_max = n;
}
next=0;
while( left_min<left_max && right_min < right_max)//和归并相同
{
if( a[left_min]<a[right_min])
{
temp[next++]=a[left_min++];
}
else
{
temp[next++]=a[right_min++];
}
}
while(left_min<left_max)
{
a[--right_min]=a[--left_max];//处理的非常巧妙
}
while( next > 0 )
{
a[--right_min]=temp[--next];//right_min的处理
}
}
}
}
巧妙之处在于此
如果左半部分剩余 则将剩余的插入右半部分的最右边 因为(这是在原数组上操作,右边的已经进入工作数组)
将工作数组插入进原数组。这里必须关注right_min的值