C 中的合并排序不起作用
Mergesort in C not working
我的合并排序实现不起作用,我不明白为什么。
方法如下:
void merge_sort(int A[], int i, int j)
{
if(i<j)
{
int n = j-i+1;
int k = n/2;
merge_sort(A, i, i+k-1);
merge_sort(A, i+k, j);
merge(A, i, i+k, j);
}
}
这就是合并方法:
void merge(int A[], int a, int b, int j)
{
int* T = malloc(sizeof(int)*DIM);
int c=0;
int h=a;
while(a<b && b<=j)
{
if(A[a] > A[b])
T[c++] = A[a++];
else
T[c++] = A[b++];
}
while(a<b) T[c++] = A[a++];
while(b<=j) T[c++] = A[b++];
c=0;
while(h<=j)
A[h++] = T[c++];
}
我是这样称呼merge_sort的:
merge_sort(A, 0, DIM-1);
其中 DIM 是数组的长度减一。
这是输出:
5 2 4 6 8 9 7 1 3 10
0 9
0 4
0 1
2 4
3 4
5 9
5 6
7 9
8 9
10 9 8 7 10 6 5 4 3 2
上半场完全有序,下半场也减一。
我不知道问题出在哪里。
您的代码有 2 个问题。
- 计算的边界不正确。
- 您的
while
条件不正确。
不正确的 while
在这里:
while(a<b && b<=j)
{
if(A[a] > A[b])
T[c++] = A[a++];
else
T[c++] = A[b++];
}
在这个循环中,你增加 b
而它也在你的条件下,这会影响你的循环。
这是我更正的代码(i
包含在数组中,而 j
被排除在外):
void merge_sort(int A[], int i, int j)
{
if(j-i>=2) // since j is excluded, this condition means that we have more than 1 member.
{
int k = (j+i)/2;
merge_sort(A, i, k);
merge_sort(A, k, j);
merge(A, i, k, j);
}
}
void merge(int A[], int a, int b, int j)
{
int* T = malloc(sizeof(int)*DIM);
int c=0;
int h=a;
int m = b;
while(a<b && m<j) // b and j are excluded
{
if(A[a] > A[m])
T[c++] = A[a++];
else
T[c++] = A[m++];
}
while(a<b) T[c++] = A[a++];
while(m<j) T[c++] = A[m++];
c=0;
while(h<j)
A[h++] = T[c++];
}
和运行它与:
merge_sort(A, 0, DIM);
我的合并排序实现不起作用,我不明白为什么。
方法如下:
void merge_sort(int A[], int i, int j)
{
if(i<j)
{
int n = j-i+1;
int k = n/2;
merge_sort(A, i, i+k-1);
merge_sort(A, i+k, j);
merge(A, i, i+k, j);
}
}
这就是合并方法:
void merge(int A[], int a, int b, int j)
{
int* T = malloc(sizeof(int)*DIM);
int c=0;
int h=a;
while(a<b && b<=j)
{
if(A[a] > A[b])
T[c++] = A[a++];
else
T[c++] = A[b++];
}
while(a<b) T[c++] = A[a++];
while(b<=j) T[c++] = A[b++];
c=0;
while(h<=j)
A[h++] = T[c++];
}
我是这样称呼merge_sort的:
merge_sort(A, 0, DIM-1);
其中 DIM 是数组的长度减一。
这是输出:
5 2 4 6 8 9 7 1 3 10
0 9
0 4
0 1
2 4
3 4
5 9
5 6
7 9
8 9
10 9 8 7 10 6 5 4 3 2
上半场完全有序,下半场也减一。 我不知道问题出在哪里。
您的代码有 2 个问题。
- 计算的边界不正确。
- 您的
while
条件不正确。
不正确的 while
在这里:
while(a<b && b<=j)
{
if(A[a] > A[b])
T[c++] = A[a++];
else
T[c++] = A[b++];
}
在这个循环中,你增加 b
而它也在你的条件下,这会影响你的循环。
这是我更正的代码(i
包含在数组中,而 j
被排除在外):
void merge_sort(int A[], int i, int j)
{
if(j-i>=2) // since j is excluded, this condition means that we have more than 1 member.
{
int k = (j+i)/2;
merge_sort(A, i, k);
merge_sort(A, k, j);
merge(A, i, k, j);
}
}
void merge(int A[], int a, int b, int j)
{
int* T = malloc(sizeof(int)*DIM);
int c=0;
int h=a;
int m = b;
while(a<b && m<j) // b and j are excluded
{
if(A[a] > A[m])
T[c++] = A[a++];
else
T[c++] = A[m++];
}
while(a<b) T[c++] = A[a++];
while(m<j) T[c++] = A[m++];
c=0;
while(h<j)
A[h++] = T[c++];
}
和运行它与:
merge_sort(A, 0, DIM);