C - Алгоритм сортировки вставок - PullRequest
0 голосов
/ 30 октября 2018

Я пытаюсь отсортировать набор чисел следующим образом:

A[]={3,6,7,2,9,1,2,7,2}
A[]={3,6,7,2,2,2,9,1,7}

Итак, я сделал это:

void sort_min(int* point, int size_array, int min_n){
    int i = 0;
    int j = 0;
    int k = 0;
    while(point[i] != min_n){
        i++;
    }
    j = i+1;
    while(point[j] != min_n){
        j++;
    }
    k = j;
    for (j-1; j > i; j--){
        point[j] = point[j-1];
    }
    point[j] = min_n;
    j = k+1;
}

Как вы можете заметить, я никогда не использовал int size_array причину Я не знаю, как сопоставить итеративную функцию, такую ​​как for или a while (Вот и вопрос. Как это решить?). Я сделал это, конечно, но у меня есть Segmentation fault ответ.

Основная концепция ищет число int min_n и до этого момента сортирует это число при каждом появлении в массиве.

Спасибо за все.

Ответы [ 2 ]

0 голосов
/ 30 октября 2018

Вам нужно использовать size_array, как показано ниже, если вы спрашиваете об этом.

  1. Вам нужно сравнить i и j с size_array в while.

    while (i < size_array && point[i] != min_n) {
          i++
    }
    
  2. Нужно проверить значение i, j после while. Они могут быть больше или равны size_array.

    while (i < size_array && point[i] != min_n) {
          i++
    }
    
    // I guess when you don't find min_n, function can just return.
    if (i >= size_array)   
           return;
    
    j = i+1;
    while(j < size_array && point[j] != min_n){ // Also need check j's value.
           j++;
    }
    
    // Also guess when can't find the second min_n position, function can return.
    if (j >= size_array) 
           return; 
    
    k = j
    for (; j > i; j--)  // No need j-1.
           point[j] = point[j-1];
    
    // This is useless. When code come here, j == i and point[i] == min_n;
    point[j] = min_n;  
    
    j = k+1;
    
0 голосов
/ 30 октября 2018

Попробуйте сортировку вставкой с кодом следующим образом.

void sort_min(int point[], int size_array) 
{ 
   int i, key, j; 
   for (i = 1; i < size_array; i++) 
   { 
       key = point[i]; 
       j = i-1; 

       /* Move elements of arr[0..i-1], that are 
          greater than key, to one position ahead 
          of their current position */
       while (j >= 0 && point[j] > key) 
       { 
           point[j+1] = point[j]; 
           j = j-1; 
       } 
       point[j+1] = key; 
   } 
} 
...