任何人都可以解释为什么这不起作用?我无法将数组中的数字排序并放入空b数组中。我已经搜索过高低,但似乎有些东西让我不能,我的同伴cod3rz!
#include <stdio.h>
#include <string.h>
void merge(int array[], int low, int mid, int high);
void midpoint(int array[], int low, int high);
int main(int argc, const char * argv[]){
int b[100];
int array[] = { 13, 23, 37, 45, 55, 68, 79, 93};
int arrayLength = sizeof(array)/sizeof(array[0]);
for (int i =0 ; i < arrayLength; i++){
for ( int j= 1 + i ; j < arrayLength; j++){
midpoint(&array[i], i ,j );{
}
printf("%d\n", *b);
}
}
return 0;
}
void merge(int array[], int low, int mid, int high)
{
int b[100];
int b[100];
int i = low;
int b[100];
int j = mid + 1;
int b[100];
int k = 0;
while (i <= mid && j <= high) {
if (array[i] <= array[j])
b[k++] = array[i++];
else
b[k++] = array[j++];
}
while (i <= mid)
b[k++] = array[i++];
while (j <= high)
b[k++] = array[j++];
k--;
while (k > 0) {
array[low + k] = b[k];
k --;
}
}
void midpoint(int array[], int low, int high)
{
int mid;
if (low < high) {
mid = (high + low)/2;
midpoint(array, low, mid);
midpoint(array, mid + 1, high);
merge(array, low, mid, high);
}
}
答案 0 :(得分:1)
首先,您没有将b
数组传递给递归调用,因此无法填充它。
此外,您应该能够在助手数组的帮助下在array
中就地进行排序,这有助于合并操作。
因此,最高级别不需要b
。
您的merge()
功能有点逆转。您应该做的是最初将整个array
数组复制到temp b
数组中,然后从b
合并到array
。
这样,当算法完成后,array
将在顶层排序,然后你就有了排序的数组。
另外,删除嵌套的for循环。由于MergeSort是一种递归的分而治之算法,你应该从对midpoint()
的一次调用开始,如果正确实现,递归将处理其余的。
所以这个:
for (int i =0 ; i < arrayLength; i++){
for ( int j= 1 + i ; j < arrayLength; j++){
midpoint(&array[i], i ,j );{
}
printf("%d\n", *b);
}
应该就是这样:
midpoint(array, 0 ,arrayLength-1 );
此外,您有一个支架问题,从此行取出开口支架,并根据需要清理关闭支架:
midpoint(&array[i], i ,j );{
编辑:除了我上面概述的内容之外,实际上还有很多问题。 我对你的答案犹豫不决,因为这可能是一项学校作业,但是既然你做了很多努力,而且你的一般代码结构几乎是正确的,那就不是你能做到的了。在网上搜索并找到类似的解决方案,我会继续发布这个。
这是一个可以正确实现基于代码的MergeSort算法的工作解决方案:
#include <stdio.h>
#include <string.h>
void merge(int *array, int low, int mid, int high);
void midpoint(int *array, int low, int high);
int main(int argc, const char * argv[]){
int array[] = { 100, 13, 44, 23, 22, 37, 3, 45, 2, 55, 68, 1, 79, 93, 4};
int arrayLength = sizeof(array)/sizeof(array[0]);
//start the recursive calls
midpoint(array, 0 ,arrayLength-1 );
int i;
for (i = 0; i < arrayLength; i++ ){
printf("%d\n", array[i]);
}
return 0;
}
void merge(int *array, int low, int mid, int high)
{
int b[100];
//copy the current elements into temp array
int v;
for (v = low; v <= high; v++){
b[v] = array[v];
}
int i = low;
int j = mid + 1;
int k = low;
//merge left side and right side into array in sorted order
while (i <= mid && j <= high) {
if (b[i] <= b[j])
array[k++] = b[i++];
else
array[k++] = b[j++];
}
//The left side might have left-over elements
while (i <= mid)
array[k++] = b[i++];
}
void midpoint(int *array, int low, int high)
{
int mid;
if (low < high) {
mid = (high + low)/2;
midpoint(array, low, mid);
midpoint(array, mid + 1, high);
merge(array, low, mid, high);
}
}
输出:
1
2
3
4
13
22
23
37
44
45
55
68
79
93
100