Немного о сортировке слиянием.
Основная идея:
mergesort(l, r):- middle = (l + r) / 2
- mergesort(l, middle)
- mergesort(middle + 1, r)
- объединить обе отсортированных части в одну отсортированную часть.
Особенно актуально освоить сортировки пишущим на языке Pascal, потому что о стандартных сортировках на этом языке я не знаю. И никто из моих знакомых не знает. Печаль. А уметь быстро сортировать нужно.
- Cтраница 6 - сортировка слиянием на питоне (от Дениса Павловича Кириенко)
- Красивая картинка в тему на странице 6 (от Михаила Сергеевича Густокашина)
- Википедия. Куда ж без неё?
- Страница 23 и далее - написано очень академическим и недостаточно понятным языком, но попробовать почитать стоит (от Кормена и ещё трех непонятных личностей)
- void
- mergesort(int *a, int *b, int l, int r){
- if (l == r)
- return;
- int middle = (l + r) / 2;
- mergesort(a, b, l, middle);
- mergesort(a, b, middle + 1, r);
- int begin1 = l, end1 = middle;
- int begin2 = middle + 1, end2 = r;
- int pos = l;
- while (begin1 <= end1 && begin2 <= end2){
- if (a[begin1] < a[begin2]){
- b[pos] = a[begin1];
- begin1++, pos++;
- }
- else{
- b[pos] = a[begin2];
- begin2++, pos++;
- }
- }
- while (begin1 <= end1){
- b[pos] = a[begin1];
- begin1++, pos++;
- }
- while (begin2 <= end2){
- b[pos] = a[begin2];
- begin2++, pos++;
- }
- for (int i = l; i <= r; ++i)
- a[i] = b[i];
- }
Последнее изменение: Суббота, 15 Август 2020, 02:34