Можно слегка улучшить алгоритм, убрав перестановку элементов. Делается это примерно так: пишем текущий во временную переменную, затем сравниваем его с предыдущим, если предыдущий больше, то пишем его значение в текущую, сдвигаемся на индекс вниз, опять сравниваем и так далее. Ещё есть вариант, чтобы не проверять, дошли ли мы до начала массива или нет, первой итеррацией найти минимальный элемент и положить его в первую ячейку.
какая разница, если после остановки весь промежуточный ряд надо будет передвигать по тому же принципу через буфер? не проще сразу это делать за один пход? или я что то не допонял?
@@eladkipiani2200 он имеет ввиду int x = arr[i]; int k = i; while (k > 0 and arr[k - 1] > x) { arr[k] = arr[k - 1]; k--; } arr[k] = x; В этом случае Не надо будет каждый раз внутри цикла менять местами переменные. Можно просто как в циклическом сдвиге сдвинуть элементы вправо. То есть внутри цикла вместо вот этого: int tmp = arr[k]; arr[k] = arr[k - 1]; arr[k - 1] = tmp; j--; Мы получаем вот это: arr[k] = arr[k - 1]; k--; Меньше операций.
а сли 0 является элементом массива? что тогда нужно писать в условии выхода из цикла? х равен ноль-терминанте или EOF? что находится в конце целочисельного массив, ведь насколько знаю ноль-терминанта касается массива символов (де-факто - строки)?
Спасибо за ролик. Возник вопрос. Чтобы присвоить значение аргументу функции внутри тела функции, нужно передать его указатель (как в scanf-е). А тут мы передаем массив, а не указатель на него, и присваивание "глобальному" массиву А происходит. Почему так получается?
Массив никогда не копируется в функцию, это не как переменная. В функцию передается адрес массива. если копировать сам массив на 10 000 элементов, то это безумие, от того сколько ресурсов понадобится. По умолчарию там заложено &mas[ ] а на деле просто mas[ ]
в строке второго цикла while (k > 0 and A[k-1] > A[k]) стоит сказать, что второе условие (после and не выполняется при k = -1) это совсем не очевидно, т.к. выражение в скобках ( ) и по логике математики должно быть вычислено полностью
Какой блять строкой кода, какой нахуй заучка математик? Он показывает один из алгоритмов сортировки и как его написать самому. То что ты отсортируешь этот массив "строчкой кода", будет означать лишь то, что ты воспользовался встроенной функцией
Лучшее объяснение алгоритма вставки на всем русскоязычном youtube!
Браво, Маэстро! По Вашему уроку объяснил сортировку по методу вставки! Все поняли и всё понятно! СПАСИБО от Солдатов!
Не могли бы объяснить почему в переменную N записалось максимальное число в массиве?
@@epheymind8475 N - это весь отсортиров. массив, а не какое-то число..
Большое спасибо! Вы огромный молодец. Все доступно и понятно.
Молодец, не знаю что без тебя делал)
Отличный материал. Покажите, пожалуйста, реализацию "быстрой сортировки". Она же в большинстве стандартных библиотек реализована (C++, Java).
Чувак спасибо за материал, успехов тебе
Какой же хороший человек
Сразу видно нормально
Можно слегка улучшить алгоритм, убрав перестановку элементов. Делается это примерно так: пишем текущий во временную переменную, затем сравниваем его с предыдущим, если предыдущий больше, то пишем его значение в текущую, сдвигаемся на индекс вниз, опять сравниваем и так далее. Ещё есть вариант, чтобы не проверять, дошли ли мы до начала массива или нет, первой итеррацией найти минимальный элемент и положить его в первую ячейку.
какая разница, если после остановки весь промежуточный ряд надо будет передвигать по тому же принципу через буфер? не проще сразу это делать за один пход? или я что то не допонял?
сортировка Шелла и есть усовершенствованная сортировка вставками.
@@eladkipiani2200 он имеет ввиду
int x = arr[i];
int k = i;
while (k > 0 and arr[k - 1] > x)
{
arr[k] = arr[k - 1];
k--;
}
arr[k] = x;
В этом случае Не надо будет каждый раз внутри цикла менять местами переменные. Можно просто как в циклическом сдвиге сдвинуть элементы вправо.
То есть внутри цикла вместо вот этого:
int tmp = arr[k];
arr[k] = arr[k - 1];
arr[k - 1] = tmp;
j--;
Мы получаем вот это:
arr[k] = arr[k - 1];
k--;
Меньше операций.
Respect
можно такое же видео,только методом выбора?
а сли 0 является элементом массива? что тогда нужно писать в условии выхода из цикла? х равен ноль-терминанте или EOF? что находится в конце целочисельного массив, ведь насколько знаю ноль-терминанта касается массива символов (де-факто - строки)?
Это цикл в цикле. Главный цикл заканчивается, когда i станет равно длинне массива - 1.
Спасибо за ролик. Возник вопрос. Чтобы присвоить значение аргументу функции внутри тела функции, нужно передать его указатель (как в scanf-е). А тут мы передаем массив, а не указатель на него, и присваивание "глобальному" массиву А происходит. Почему так получается?
имя массива - указатель на первый элемент массива
Массив никогда не копируется в функцию, это не как переменная. В функцию передается адрес массива. если копировать сам массив на 10 000 элементов, то это безумие, от того сколько ресурсов понадобится. По умолчарию там заложено &mas[ ] а на деле просто mas[ ]
сортировка Шелла интересует.
Извините за тупой вопрос, но как сортировать по убыванию, а то я попробовал сделать но у меня цикл бесконечный получился. Помогите пожалуйста.
Не поздна надеюсь отвечаю, просто в while (k > 0 and arr[k-1] > arr[k]) измени условие arr[k-1] > arr[k] на arr[k-1] < arr[k]
@@user-ic2wx3qw1w я справился сам посже, но спасибо
I like Code::Blocks. It is my favorite IDE for Windows.
u r loh from the block.
ее, киса на фоне
сортировка вставками 11:15
14:14 Почему такой большой execution time (4.256s)?
Вероятно срабатывает фаервол, т.е. начинает проверять скомпилированный исполняемый файл.
Время ввода учитывается вроде там
@@dezm0n679 да
в строке второго цикла while (k > 0 and A[k-1] > A[k]) стоит сказать, что второе условие (после and не выполняется при k = -1) это совсем не очевидно, т.к. выражение в скобках ( ) и по логике математики должно быть вычислено полностью
По логике k = -1, это выход за границы массива, и первое условие говорит об этом, Я пойду только пока я больше нуля( k > 0)
чушь какую-то написал.
на какую сортировку похож этот код?
for(int i = 0; i < n; i++)
{
for(int j = 1; j < n-i; j++)
{
if(arr[i] > arr[n-j])
{
int tmp = arr[n-j];
arr[n-j] = arr[i];
arr[i] = tmp;
}
}
}
Сортировка не работает
это bubble sort?
Но вопрос логичный, у меня подбный тоже возник!
Бедные солдаты.
Без 39 строки (К-=1) тоже работает
Нет, не работает. Но если в этой строке поставить i = 1, то получится сортировка пузырьком.
Чел видимо в армии небыл, прапор сортирует от высокого к низкому😂
Хах. Заучка математик проиграет прапору. Прапор может обойтись одной строкой кода со встроенной функцией бысто(мля)...
Какой блять строкой кода, какой нахуй заучка математик? Он показывает один из алгоритмов сортировки и как его написать самому. То что ты отсортируешь этот массив "строчкой кода", будет означать лишь то, что ты воспользовался встроенной функцией
@@user-wb1zc6we4y ты идиот без чувства юмора и тебе девки не дают.
почему не взять и не купить нормальный микрофон, который не СКРИПИТ, и тогда восприятие материала будет более комфортным для зрителя?
Умный человек , хоть и гей .
сильны ты свой интеллектуальный уровень завысил...