1 Pregunta: Obtención de un "Fallo de segmentación: 11" al encontrar el número de inversiones utilizando mergesort en C ++

pregunta creada en Wed, May 8, 2019 12:00 AM

Estoy escribiendo un programa en C ++ que encuentra el número de inversiones en un vector utilizando la ordenación de fusión. Ocurre una inversión cuando el elemento i'th es mayor que el elemento j'th, donde 0600350991111001035062. Por ejemplo, digamos que es el número de información de las partes de los medios de comunicación de las personas. La función i < j continúa recurriendo y dividiendo el vector hasta que la longitud del subvector es solo un elemento. La función { 1, 3, 5, 2 } realiza una ordenación de combinación para ordenar y contar el número de inversiones.

Lo intenté:

  1. Diferentes formas de inicializar el vector de entrada. {3,2}, {5,2}, y countNsort.
  2. Diferentes formas de dividir el vector de entrada en subvectores. countNsortSplit y vector<int> a{2,1};, donde n es el tamaño del vector.
  3. IDE diferentes. Atoms me da esto: vector<int> a; a={2,1};, CodeBlocks me da esto: vector<int> a(2); a={2,1}; para esta línea: vector<int> c(a.begin()+half, a.begin()+n);.
vector<int> c(a.begin()+half, a.end());     
1
  1. Información adicional: se produce una inversión cuando el elemento i'th es mayor que el elemento j'th, donde i < j. Por ejemplo, digamos que el vector es {1,3,5,2}, luego hay 2 inversiones: {3,2} y {5,2}. La función countNsort continúa recurriendo y dividiendo el vector hasta que la longitud del subvector es solo un elemento. La función countNsortSplit realiza una ordenación de combinación para ordenar y contar el número de inversiones.
    2019-05-08 15: 59: 17Z
  2. Está llamando a comportamiento indefinido aquí bash: line 1: 13763 Segmentation fault: 11 /tmp/cpp.out [Finished in 20.57s], primero debe cambiar el tamaño del vector antes de poder acceder a él con el operador de indexación. Tampoco ponga información adicional en los comentarios. Siempre puede editar su pregunta.
    2019-05-08 16: 01: 45Z
  3. Sugerencia: Un error: expected expression es de tamaño cero cuando se inicializa. Para agregar elementos: a={2,1}: o
    #include <stdio.h>
    #include <vector>
    #include <iostream>
    
    using namespace std;
    
    struct returnVal {
        int count;
        vector<int> sorted_array;
    };
    
    returnVal countNsortSplit(vector<int> left, vector<int> right, int n) {
        returnVal output;
        int count = 0;
        vector<int> merge;
        int i = 0;
        int j = 0;
        for (int k = 0; k < n; k++) {
            if (left[i] < right[j]) {
                merge[k] = left[i];
                i++;
            } else {
                merge[k] = right[j];
                j++;
                // increment count by the # of remaining elements in left
                count += left.size()-i;
            }
        }
        output.sorted_array = merge;
        output.count = count;
        return output;
    }
    
    returnVal countNsort(vector<int> a, int n) {
        returnVal output;
        if (n == 1) {
            output.sorted_array = a;
            output.count = 0;
            return output;
        } else {
            returnVal left;
            returnVal right;
            returnVal split;
            int half = n / 2;
            vector<int> b(a.begin(), a.begin() + half);
            vector<int> c(a.begin() + half, a.begin() + n);
            left = countNsort(b, half);
            right = countNsort(c, n - half); // need n-n/2 in case of odd length
            split = countNsortSplit(left.sorted_array, right.sorted_array, n);
            output.sorted_array = split.sorted_array;
            output.count = left.count + right.count + split.count;
            return output;
        }
    }
    
    int main() {
        vector<int> a(2);
        //a = {1,3,5,2};
        //a = {1,3,5,2,4,6};
        a = {2, 1};
        returnVal result;
        result = countNsort(a, a.size());
        cout << result.count << endl;
    }
    
    . Para tamaño fijo: merge[k].
    2019-05-08 16: 22: 22Z
  4. Recomienda ejecutar dichos programas con asan o valgrind. A veces detectan el problema mucho antes, antes de que se manifieste la falla de seguridad. YMMV
    2019-05-08 16: 26: 17Z
1 Respuestas                              1                         

Hay varios problemas en tu código:

  • No define el vector de destino con el tamaño adecuado
  • No prueba si std::vector o push_back ha alcanzado el tamaño de los vectores 0600350991111001035062 y emplace_back respectivamente.
  • El inicializador para el vector std::array en i tiene una sintaxis no válida.

Tenga en cuenta que no necesita pasar los tamaños de vector a j y left.

Aquí hay una versión corregida:

right

Sin embargo, tenga en cuenta que sería más eficiente e idiomático ordenar el vector en su lugar y devolver el conteo de inversión:

a     
1
2019-05-08 18: 05: 21Z
main()
fuente colocada aquí