Как мы знаем, в быстрой сортировке вы можете использовать Lomuto-Partition. Я проверил множество ссылок, и почти все они предлагают следующую реализацию:
int L_partition(int *a, int l, int r)
{
int i, j, p, t;
p = a[r];
i = l - 1;
for(j =l; j <= r-1; j++) {
if(a[j] <= p) {
i++;
t = a[j];
a[j] = a[i];
a[i] = t;
}
}
t = a[i+1];
a[i+1] = a[r];
a[r] = t;
return i+1;
}
У меня вопрос: почему i начинается с l-1 и содержит все элементы i + 1 ? Думаю, можно просто начать с l . Я тестирую приведенную ниже программу. И дает тот же результат, что и выше. Это намного проще, чем предыдущий.
int L_partition2(int *a, int l, int r)
{
int i, j, p, t;
p = a[r];
i = l;
for(j = l; j <= r-1; j++) {
if(a[j] <= p) {
t = a[j];
a[j] = a[i];
a[i] = t;
i++;
}
}
t = a[i];
a[i] = a[r];
a[r] = t;
return i;
}
1 ответ
Это точно то же самое, что вы просто меняете использование i
.
Обратите внимание, что вы увеличиваете i после свопа, потому что ваш действителен с самого начала, а исходная версия увеличивает его перед свопом. Но важно то, что своп всегда использует один и тот же элемент (в вашей версии и в оригинале).
Похожие вопросы
Новые вопросы
c
C - это язык программирования общего назначения, используемый для системного программирования (ОС и встраиваемых), библиотек, игр и кроссплатформенности. Этот тег следует использовать с общими вопросами, касающимися языка C, как это определено в стандарте ISO 9899 (последняя версия 9899: 2018, если не указано иное, а также для запросов, специфичных для версии, с c89, c99, c11 и т. Д.). C отличается от C ++ и не должен сочетаться с тэгом C ++ без разумной причины.