程序中如果有代码风格问题或者类似指针没free的问题都欢迎指出
#include <stdio.h>
#include <malloc.h>
int *merger(int *arr1, int length1, int *arr2, int length2);
void sort(int *arr, int length);
int main(void)
{
int i;
/* 测试merger的归并效果
int a[] = {3, 1, 5, 7, 9};
int b[] = {2, 6, 4, 8};
int *p = NULL;
p = merger(b, 4, a, 5); */
int p[] = {1, 3, 5, 7, 9, 8, 6, 4, 2};
sort(p, 9);
for (i = 0; i < 9; i++)
{
printf("%d\t", p[i]);
}
printf("\n");
}
/*
*实现两个有序数组的归并
*
*/
int *merger(int *arr1, int length1, int *arr2, int length2)
{
int i = 0;
int j = 0;
int k = 0;
int *arr = NULL;
arr = (int *)malloc(sizeof(int)*(length1+length2));
if (NULL == arr)
{
arr = NULL;
goto exit;
}
while (i < length1 && j < length2)
{
if (arr1[i] < arr2[j])
{
arr[k++] = arr1[i++];
}
else
{
arr[k++] = arr2[j++];
}
}
while (i < length1)
{
arr[k++] = arr1[i++];
}
while (j < length2)
{
arr[k++] = arr2[j++];
}
exit:
return arr;
}
void sort(int *arr, int length)
{
int length1, length2;
int *arr1, *arr2;
int *p;
if (length > 1)
{
length1 = length/2;
length2 = length - length1;
arr1 = arr;
arr2 = arr+length1;
sort(arr1, length1);
sort(arr2, length2);
p = merger(arr1, length1, arr2, length2);
}
arr = p;
}
能写下归并排序么?
非常感谢你的回答。
1、题目不是归并,而是归并排序,所以sort是非常有必要的
2、goto一般是为了保证程序的单出口,所以还是很常用到的
不好意思没看懂你的程序用的是什么算法,你的程序应该是没经过测试的,程序中出现中文的符号,首先编译就不能通过了。最后一行的sort中sort的第一个参数传的应该是地址吧,不明白你为什么要取内容?
追答我只是写了程序流程,来表示怎么用递归来排序,主要的算法就是每次找到一组数中的最大数,然后放到数的最后。
追问那这个是冒泡排序了,能否写下归并排序,行的话分就给你了