我知道有许多合并排序的实现,但这是我在书中所读到的#34;算法简介"。以下代码是合并排序的实现,它无法正常工作:
#include <iostream>
using namespace std;
void merge(int*a, int p, int q, int r) { //function to merge two arrays
int n1 = (q - p); // size of first sub array
int n2 = (r - q); // size of second subarray
int c[n1], d[n2];
for (int i = 0; i <= n1; i++) {
c[i] = a[p + i];
}
for (int j = 0; j <= n2; j++) {
d[j] = a[q + j];
}
int i = 0, j = 0;
for (int k = p; k < r; k++) { // merging two arrays in ascending order
if (c[i] <= d[j]) {
a[k++] = c[i++];
} else {
a[k++] = d[j++];
}
}
}
void merge_sort(int*a, int s, int e) {
if (s < e) {
int mid = (s + e) / 2;
merge_sort(a, s, mid);
merge_sort(a, mid + 1, e);
merge(a, s, mid, e);
}
}
int main() {
int a[7] { 10, 2, 6, 8, 9, 10, 15 };
merge_sort(a, 0, 6);
for (auto i : a)
cout << i << endl;
}
此代码无法正常运行。这段代码有什么问题?如何解决?
答案 0 :(得分:0)
首先,您应该正确设置数组的大小。
void merge(int*a, int p, int q, int r) { //function to merge two arrays
/* If i am not wrong , p is the starting index of the first sub array
q is the ending index of it also q+1 is the starting index of second
sub array and r is the end of it */
/* size of the sub array would be (q-p+1) think about it*/
int n1 = (q - p); // size of first sub array
/* This is right n2 = (r-(q+1)+1)*/
int n2 = (r - q); // size of second subarray
int c[n1], d[n2];
for (int i = 0; i < n1; i++) {
c[i] = a[p + i];
}
for (int j = 0; j < n2; j++) {
d[j] = a[q + 1 + j];
}
.
.
.
}
现在,在此之后,您已在本地定义的数组中复制这两个数组。在此之前,这是正确的。
现在主要部分是在for循环中合并两个数组。您只是将第一个子数组的第i个元素与第二个子数组的第j个元素进行比较,但您在这里缺少的是可能有一段时间更新了主要数据中第一个(或第二个)子数组的所有值数组,但仍有一些元素保留在第二个(第一个)中。
例如,采用这两个子阵列
sub1={2,3,4,5};
sub2={7,8,9,10};
在这种情况下,只要您完全遍历任何一个数组并以相同的顺序复制另一个数组的其余元素,就应该从循环中断开。 同样在for循环中,你在循环中增加k两次,一个在for语句中,另一个在更新值时,检查一下。 希望这可以解决问题。
答案 1 :(得分:-1)
在实现逻辑时出现了一些问题。我在下面清楚地说明了这些:
listBox1.Visible = true;
listBox1.Items.Add(comboBox2.Text);
listBox2.Items.Add((comboBox2.SelectedItem as ComboboxItem).Value.ToString());