Придерживайтесь встроенной функцией сортировки. Quicksort - это простой алгоритм, но для получения хорошей производительности на компьютерах, которые на самом деле используются, требуется немного тонкости. Более чем вероятно, что встроенная функция уже оптимизирована, чем все, что вы могли бы написать за разумное время. (Вероятно, использование константного фактора из написания в C вместо PHP также полезно.)
Если вы сортируете так много элементов, что вы замедляете функцию сортировки, вы, вероятно, делаете что-то неправильно , (Это, в конце концов, PHP. Вы должны использовать язык общего назначения для интенсивной обработки данных. Будет проще писать код, и он будет работать быстрее.)
Три вещи объявляются здесь: анонимный перечислимый тип объявляется, ShapeType
объявляется определением типа для того анонимного перечисления и тремя именами kCircle
, kRectangle
, и kOblateSpheroid
объявляются как интегральные константы.
Давайте сломаем это. В самом простом случае перечисление может быть объявлено как
enum tagname { ... };
Это объявляет перечисление с тегом tagname
. В C и Objective C (но не C++), любым ссылкам на это нужно предшествовать с enum
ключевое слово. Например:
enum tagname x; // declare x of type 'enum tagname'
tagname x; // ERROR in C/Objective-C, OK in C++
Чтобы избежать необходимости использовать enum
ключевое слово везде, определение типа может быть создано:
enum tagname { ... };
typedef enum tagname tagname; // declare 'tagname' as a typedef for 'enum tagname'
Это может быть упрощено в одну строку:
typedef enum tagname { ... } tagname; // declare both 'enum tagname' and 'tagname'
И наконец, если мы не должны мочь использовать enum tagname
с enum
ключевое слово, мы можем сделать enum
анонимный и только объявляют это с именем определения типа:
typedef enum { ... } tagname;
Теперь, в этом случае, объявляем мы ShapeType
быть typedef'ed названием анонимного перечисления. ShapeType
действительно просто целочисленный тип и должен только использоваться для объявления переменных, которые содержат одно из значений, перечисленных в объявлении (то есть, один из kCircle
, kRectangle
, и kOblateSpheroid
). Можно присвоить a ShapeType
переменная другое значение путем кастинга, тем не менее, таким образом, необходимо быть осторожными при чтении перечислимых значений.
Наконец, kCircle
, kRectangle
, и kOblateSpheroid
объявляются как интегральные константы в глобальном пространстве имен. Так как никакие определенные значения не были указаны, они присвоены последовательным целым числам, запускающимся с 0, таким образом, kCircle
0, kRectangle
1, и kOblateSpheroid
2.
Определяемый пользователем тип, который имеет возможные значения kCircle
, kRectangle
, или kOblateSpheroid
. Значения в перечислении (kCircle, и т.д.) видимы вне перечисления, все же. Важно иметь это в виду (int i = kCircle;
допустимо, например).