#arrays #c #sorting #for-loop #bubble-sort
#массивы #c #сортировка #for-цикл #пузырьковая сортировка
Вопрос:
#include<stdio.h>
int main(void)
{
int array[10] = { 10,2,9,4,5,6,7,8,3,1 };
/*Implementing Bubble Sort */
int temp;
for (int i = 0; i < 9; i )
{
for (int j = 0; j < 10 - i; j )
{
if (array[j] > array[j 1])
{
temp = array[j];
array[j] = array[j 1];
array[j 1] = temp;
}
}
}
for (int i = 0; i < 10; i )
{
printf("%d ", array[i]);
}
}
Когда я пытаюсь запустить программу, я сортирую значения, но одно значение имеет некоторое мусорное значение, и появляется диалоговое окно, в котором указано, что стек вокруг переменной поврежден в VS 2019. В каком-то другом компиляторе я получаю 0 вместо 10 в компиляторе.
Комментарии:
1. Шаг 1. Поместите это в свой отладчик и пошагово просмотрите его построчно, чтобы убедиться, что он работает правильно.
2. Да, я сделал это, на самом деле я пытался получить значение a[10] во внутреннем цикле for , которое не было определено, поэтому ошибка приходила
3. Мы все совершаем такие маленькие ошибки, как эта, так что хорошо, что вы смогли ее найти.
Ответ №1:
Внутренний цикл for .
for (int j = 0; j < 10 - i; j )
{
if (array[j] > array[j 1])
{
temp = array[j];
array[j] = array[j 1];
array[j 1] = temp;
}
}
вызывает неопределенное поведение, потому что когда j
равно 9
для первой итерации внешнего цикла, то есть когда i
равно 0
индексу в выражении array[j 1]
, может быть равно 10
, что приводит к доступу к памяти за пределами массива.
Перепишите цикл следующим образом
for (int j = 1; j < 10 - i; j )
{
if (array[j-1] > array[j])
{
temp = array[j-1];
array[j-1] = array[j];
array[j] = temp;
}
}
Ответ №2:
Вы можете слегка отредактировать эту логику по сравнению с вашей.
#include<stdio.h>
int main(void)
{
int array[10] = { 10,2,9,4,5,6,7,8,3,1 };
/*Implementing Bubble Sort */
int temp;
for (int i = 0; i < 10; i )
{
for (int j = i; j < 10; j )
{
if (array[i] > array[j])
{
temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
}
for (int i = 0; i < 10; i )
{
printf("%d ", array[i]);
}
}