Почему сортировка работает с «меньшим», а не с «меньшим или равным»? [Дубликат]

Это может быть связано с выравниванием и заполнением байт, чтобы структура выходила на четное количество байтов (или слов) на вашей платформе. Например, в C на Linux следующие 3 структуры:

#include "stdio.h"


struct oneInt {
  int x;
};

struct twoInts {
  int x;
  int y;
};

struct someBits {
  int x:2;
  int y:6;
};


int main (int argc, char** argv) {
  printf("oneInt=%zu\n",sizeof(struct oneInt));
  printf("twoInts=%zu\n",sizeof(struct twoInts));
  printf("someBits=%zu\n",sizeof(struct someBits));
  return 0;
}

У членов, размер которых (в байтах) равен 4 байтам (32 бита), 8 байтам (2x 32 бита) и 1 байт (2 +6 бит) соответственно. Вышеупомянутая программа (в Linux с использованием gcc) печатает размеры 4, 8 и 4, где последняя структура дополняется так, что это одно слово (4 x 8 бит байтов на моей 32-битной платформе).

oneInt=4
twoInts=8
someBits=4
12
задан xmllmx 17 August 2013 в 18:41
поделиться

2 ответа

std::sort требует сортировщика, который удовлетворяет строгому режиму слабого упорядочения, который здесь объясняется здесь

. Итак, ваш компартер говорит, что a < b, когда a == b, который doesn Следуя строжайшему правилу слабого упорядочения, возможно, что алгоритм сработает, потому что он войдет в бесконечный цикл.

21
ответ дан Community 18 August 2018 в 23:33
поделиться
  • 1
    +1 В этом выражаются требования к компаратору std::sort. Я хотел бы следовать этому, используя std::sort(std::begin(coll), std::end(coll));, если ваш компилятор совместим с C ++ 11 (и совместим с OPs ; VS2012). Если вы когда-либо измените размеры своего массива или вместо этого используете какой-либо из стандартных контейнеров, вы будете рады, что сделали. – WhozCraig 17 August 2013 в 19:04
  • 2
    Ввод бесконечного цикла должен просто заставлять его застревать. Вместо этого он сбрасывает ядро. Зачем? – btilly 17 August 2013 в 22:02
  • 3
    @btilly Я думаю, потому что std::sort использует рекурсивный алгоритм, который вызовет переполнение стека в случае бесконечного цикла. – xorguy 17 August 2013 в 22:17
  • 4
    Вам нужно будет узнать, что он проверяет, но стандартные процедуры сортировки предназначены для работы очень быстро, поэтому они не проверяют все, что вы делаете, чтобы убедиться, что все в порядке, они просто полагаются на него. Если ваши сравнения возвращают невозможные результаты, тогда не произойдет ничего невозможного - скажем, что у него есть результаты некоторого сравнения, и он использует это как индекс для того, где искать, только он и «знает». какие значения возможны и "знает" результирующая ссылка будет находиться в допустимом хранилище, поэтому она просто извлекает ее. Kaboom: SIGSEGV с удачей. Если вам не повезет, он тихонько вытащит ваши данные. – jthill 18 August 2013 в 03:16

Ответ на xorguy довольно хорош.

Я бы просто добавил цитату из стандарта:

25.4 Сортировка и связанные операции [alg.sorting]

Для того, чтобы алгоритмы, отличные от описанных в 25.4.3, работать корректно, comp должен индуцировать строгие слабые порядки .

Термин Строгое относится к требованию неотрицательного отношения (! comp (x, x) для всех x), а член слабый к требованиям, которые не так сильны, как требования для полного упорядочения , но сильнее, чем для частичного упорядочения.

Итак, xorguy очень хорошо объясняет это: функция comp говорит, что a < b, когда a == b, который не следует строгим слабым правило упорядочения ...

8
ответ дан Pierre Fourgeaud 18 August 2018 в 23:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: