菜鸡笔记之——归并排序
归并排序:
将数据一步步细分,对每一部分进行排序,在将各个部分合起来排序;
代码实现(归并排序):
# include <stdio.h>
# include <string.h>
# include <malloc.h>
int main(void)
{
int N;
printf("the number of the array:");
scanf("%d",&N);
int * array = NULL,* temp = NULL;
array = (int *)malloc(sizeof(int)*N);
temp = (int *)malloc(sizeof(int)*N); //临时存放数组
if (array==NULL||temp==NULL)
{
printf("error!\n");
exit(-1);
}
//输入
for (int i = 0;i<N;i++)
{
scanf("%d",array+i);
}
//排序
void mergesort(int *,int,int,int *);
void merge(int *,int,int,int,int *);
mergesort(array,0,N-1,temp);
//输出
for (int i = 0;i<N;i++)
{
printf("%d\t",*(array+i));
}
//内存释放
free(temp);
free(array);
return 0;
}
void merge(int * array,int left,int mid,int right,int * temp) //对每一部分进行“治理”
{
int i,j,k = left; //#k初值赋为left#
for (i = left,j = mid+1;i<=mid&&j<=right;) //给temp数组存数
{
if (*(array+i)>*(array+j))
{
*(temp+k++) = *(array+j++);
}
else
{
*(temp+k++) = *(array+i++);
}
}
while (i<=mid)
{
*(temp+k++) = *(array+i++);
}
while (j<=right)
{
*(temp+k++) = *(array+j++);
}
memcpy(array,temp,sizeof(int)*(right-left+1)); //把temp中的数拷贝到array
}
void mergesort(int * array,int left,int right,int * temp) //分(归并)并排序
{
if (left<right) //递归终止条件:left>=right
{
int mid;
mid = left+(right-left)/2;
mergesort(array,left,mid,temp);
mergesort(array,mid+1,right,temp);
merge(array,left,mid,right,temp);
}
}