我有一个序列,可能很长。
我正在输入元素的数量和特殊数字,这会将我的序列剪切成部分,例如:
10 2
这里我有10个数字和5个块(10/2)
我必须使用合并排序
对此序列进行排序这是代码:
int number_of_elements, k;
cin >> number_of_elements;
cin >> k;
int* massiv_1 = new int[k];
int* massiv_2 = new int[k];
int* resulted_massiv = new int[number_of_elements];
for(int i = 0; i < number_of_elements; i++) {
resulted_massiv[i] = 0;
}
int i = 0;
while( i < number_of_elements) {
int counter_1 = 0;
int counter_2 = 0;
cin >> massiv_1[counter_1];
counter_1++;
if( i != 0 ) {
quick_Sort( massiv_1, k-1 );
for(; counter_2 < k; counter_2++) {
cin >> massiv_2[counter_2];
counter_2++;
}
quick_Sort( massiv_2, k-1 );
merge(massiv_1, k, massiv_2, k, resulted_massiv, i);
}
counter_1 = 0;
counter_2 = 0;
i = i + k;
}
这是合并排序
void merge(int *a, int a_len, int *b, int b_len, int *c, int z1) {
int i = 0, j = 0;
for(;i < a_len && j < b_len;) {
if(a[i] < b[j]) {
c[z1] = a[i];
++i;
} else {
c[z1] = b[j];
j++;
}
}
if(i == a_len) {
for(; j < b_len; ++j) {
c[z1] = b[j];
}
} else {
for(; i < a_len; ++i) {
c[z1] = a[i];
}
}
}
换句话说,这就是算法:
首先,我将sequnce切成k部分
我正在经历它,如果我看到index = k,我正在使用quick_sort,
然后我去最近的街区并使用quick_sort,
然后我使用合并排序将其放入其他数组
......我这样做直到序列结束
此算法不起作用,如果输入:
10 4
0 4 3 2 1 8 7 6 5 9
它必须对此序列进行排序,但它显示了这一点:
0 0 0 0 4 0 0 0 8 0
我无法得到它
我将非常感谢您的帮助,谢谢您提前!!!
答案 0 :(得分:2)
您总是在合并函数中写入单个 c [z1] 元素,并且永远不会增加z1索引。
索引&#34; c&#34;数组应该在每一步都递增,因此您可以在函数
c[z1++]