Да, вы можете это сделать. Основная идея mergesort заключается в следующем:
- Разделить массив на две (или более) части.
- Отсортируйте каждую деталь независимо.
- Примените шаг слияния, чтобы объединить отсортированные фрагменты в один общий отсортированный список.
С точки зрения правильности, на самом деле не имеет значения, как сортировать списки, сгенерированные в части (2). Все, что имеет значение, состоит в том, что эти списки сортируются. Типичная реализация mergesort делает шаг (2) путем рекурсивного применения себя к левой и правой половине, но нет основополагающей причины, по которой вы должны это делать. (На самом деле, в некоторых оптимизированных версиях mergesort вы конкретно do not делают это и вместо этого переключаетесь на такой алгоритм, как сортировка вставки, когда массивы становятся достаточно маленькими).
В вашем случае вы правы, что использование quicksort слева и mergesort справа все равно будет производить отсортированную последовательность. Однако способ, которым он будет работать, будет выглядеть совсем иначе, чем то, что вы описываете. Что бы закончилось, это примерно так: первая половина массива будет быстро сортироваться (потому что вы быстро сортируете левую половину), тогда вы рекурсивно сортируете правую половину. В первой половине , что будет быстро сортироваться, вы рекурсивно сортируете правую половину. Первая половина что бы получить quicksorted и т.д. В целом это будет выглядеть примерно так:
- Вы QuickSort первую половину массива, то первая половина того, что осталось, то первая половина того, что это слева и т. д., пока не осталось элементов.
- Затем, работая слева направо, вы бы объединить два последних элемента вместе, то последние четыре, то последние восемь и т.д.
Это было бы очень здорово выглядящие сортируют, но делать это вручную было бы полной болью. Возможно, вам лучше написать программу, которая просто сделает это, и покажет все промежуточные шаги. :-)
Предполагая, что вы планируете слить эту «левую половину» и «правую половину», когда закончите, что имеет значение, какой алгоритм сортировки вы используете для каждого (пытаетесь ли вы сэкономить место, используя быструю сортировку на месте?). И как quicksort, так и mergesort могут быть легко реализованы в C, используя только базовый указатель и длину последовательности в качестве параметров. Арифметика арифметики объявлений позаботится об устранении одного индекса (низкий индекс) с минимальными усилиями. Вполне возможно, что я неправильно понял ваш вопрос как представленный, и если да, возможно, уточните, что вы на самом деле пытаетесь сделать? – WhozCraig
Я обновил вопрос. Также я понял из вашего ответа, что могу объединить 2 половины после их сортировки. Спасибо. – purudpd