Подтвердить что ты не робот

C Сортировка массивов

       a=[1,3,6,7,1,2]

Каков наилучший метод сортировки для сортировки следующего массива, и если есть дубликаты, как их обрабатывать. Также, это лучшая техника сортировки всех...

 void BubbleSort(int a[], int array_size)
 {
 int i, j, temp;
 for (i = 0; i < (array_size - 1); ++i)
 {
      for (j = 0; j < array_size - 1 - i; ++j )
      {
           if (a[j] > a[j+1])
           {
                temp = a[j+1];
                a[j+1] = a[j];
                a[j] = temp;
           }
      }
 }
 }   
4b9b3361

Ответ 1

В C вы можете использовать встроенную команду qsort:

int compare( const void* a, const void* b)
{
     int int_a = * ( (int*) a );
     int int_b = * ( (int*) b );

     if ( int_a == int_b ) return 0;
     else if ( int_a < int_b ) return -1;
     else return 1;
}

qsort( a, 6, sizeof(int), compare )

см. http://www.cplusplus.com/reference/clibrary/cstdlib/qsort/


Чтобы ответить на вторую часть вашего вопроса: оптимальный (сопоставительный) алгоритм сортировки - это тот, который выполняется с сравнениями O (n log (n)). Есть несколько свойств, которые имеют это свойство (включая быструю сортировку, сортировку слияния, сортировку кучи и т.д.), Но один из которых зависит от вашего использования.

В качестве побочного примечания вы можете когда-нибудь сделать лучше, чем O (n log (n)), если вы знаете что-то о своих данных - см. статью wikipedia на Radix Sort

Ответ 2

В вашем конкретном случае самый быстрый вид, вероятно, описан в этом ответе. Он точно оптимизирован для массива из 6 цепей и использует сортировочные сети. Это 20 раз (измеряется на x86) быстрее, чем библиотека qsort. Сортировочные сети оптимальны для сортированных массивов с фиксированной длиной. Поскольку они представляют собой фиксированную последовательность инструкций, они могут быть легко реализованы с помощью аппаратного обеспечения.

Вообще говоря, существует множество алгоритмов сортировки, оптимизированных для некоторого специализированного случая. Алгоритмы общего назначения, такие как сортировка кучи или быстрый сортировка, оптимизированы для сортировки массива элементов на месте. Они дают сложность O (n.log(n)), n - количество элементов для сортировки.

Функция библиотеки qsort() очень хорошо закодирована и эффективна с точки зрения сложности, но использует вызов некоторой функции сопоставления, предоставляемой пользователем, и этот вызов имеет довольно высокую стоимость.

Для сортировки очень большого количества алгоритмов данных также нужно позаботиться о замене данных на диск и с диска, это вид сортировки, реализованный в базах данных, и ваш лучший выбор, если у вас есть такие потребности, чтобы помещать данные в какую-либо базу данных и используйте встроенную сортировку.

Ответ 3

В зависимости

Это зависит от разных вещей. Но в целом алгоритмы с использованием Divide-and-Conquer/dichotomic подходит для задач сортировки, поскольку они представляют интересную сложность среднего порядка.

Основы

Чтобы понять, какие алгоритмы работают лучше всего, вам понадобятся базовые знания алгоритмы сложности и примечание Big-O, так что вы можете понять, как они оцениваются с точки зрения среднего случая, наилучшего случая и сценариев наихудшего случая, При необходимости вам также необходимо обратить внимание на стабильность алгоритма сортировки.

Например, обычно эффективным алгоритмом является quicksort. Однако, если вы дадите quicksort совершенно инвертированный список, то он будет работать плохо (простой выбор сортировки будет работать лучше в этом случае!). Shell-sort также обычно будет хорошим дополнением к быстрой сортировке, если вы выполните предварительный анализ своего списка.

Взгляните на следующее: "расширенные поиски" с использованием подходов "разделять" и "побеждать":

И эти более сложные алгоритмы для менее сложных:

Далее

Вышеуказанные обычные подозреваемые при запуске, но есть и другие.

Как указано Р. в комментариях и крисом в его ответе, вы можете взглянуть на HeapSort, что обеспечивает теоретически лучшую сложность сортировки, чем quicksort (но в практических настройках она не будет часто улучшаться). Существуют также варианты и гибридные алгоритмы (например, TimSort).

Ответ 4

Наилучшая техника сортировки вообще зависит от размера массива. Сорт слияния может быть лучшим из всех, поскольку он управляет лучшей сложностью пространства и времени в соответствии с алгоритмом Big-O (это лучше подходит для большого массива).

Ответ 5

Я хотел бы внести некоторые изменения: В C вы можете использовать встроенную команду qsort:

int compare( const void* a, const void* b)
{
   int int_a = * ( (int*) a );
   int int_b = * ( (int*) b );

   // an easy expression for comparing
   return (int_a > int_b) - (int_a < int_b);
}

qsort( a, 6, sizeof(int), compare )