排序几乎有序的序列

时间:2014-04-29 09:18:10

标签: algorithm sorting

我有一个序列,可能很长。

我正在输入元素的数量和特殊数字,这会将我的序列剪切成部分,例如:

 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

我无法得到它

我将非常感谢您的帮助,谢谢您提前!!!

1 个答案:

答案 0 :(得分:2)

您总是在合并函数中写入单个 c [z1] 元素,并且永远不会增加z1索引。
索引&#34; c&#34;数组应该在每一步都递增,因此您可以在函数

中的任何地方使用c[z1++]