Пример программы сортировки слиянием Merge Sort на C#

В этой статье мы обсудим сортировку слиянием в C#

Слияние сортировка является одним из популярных алгоритмов сортировки в C#, поскольку он использует минимальное количество сравнений.

Идея сортировки слиянием заключается в том, что она объединяет два отсортированных списка.

Сортировка слиянием имеет порядок O(nlogn)

Вот высокоуровневое представление алгоритма сортировки слиянием:

using System;
using System.Collections.Generic;
using System.Text;

namespace CSharpMergeSort
{
    class Mergesort
    {

        static public void DoMerge(int[] numbers, int left, int mid, int right)
        {
            int[] temp = new int[25];
            int i, left_end, num_elements, tmp_pos;

            left_end = (mid - 1);
            tmp_pos = left;
            num_elements = (right - left + 1);

            while ((left <= left_end) && (mid <= right))
            {
                if (numbers[left] <= numbers[mid])
                    temp[tmp_pos++] = numbers[left++];
                else
                    temp[tmp_pos++] = numbers[mid++];
            }

            while (left <= left_end)
                temp[tmp_pos++] = numbers[left++];

            while (mid <= right)
                temp[tmp_pos++] = numbers[mid++];

            for (i = 0; i < num_elements; i++)
            {
                numbers[right] = temp[right];
                right--;
            }
        }

        static public void MergeSort_Recursive(int[] numbers, int left, int right)
        {
            int mid;

            if (right > left)
            {
                mid = (right + left) / 2;
                MergeSort_Recursive(numbers, left, mid);
                MergeSort_Recursive(numbers, (mid + 1), right);

                DoMerge(numbers, left, (mid + 1), right);
            }
        }

        static void Main(string[] args)
        {
            int[] numbers = { 3, 8, 7, 5, 2, 1, 9, 6, 4 };
            int len = 9;

            Console.WriteLine("MergeSort рекурсивным методом");
            MergeSort_Recursive(numbers, 0, len - 1);
           
            for (int i = 0; i < 9; i++)
                Console.WriteLine(numbers[i]);

            Console.ReadKey();

        }
    }
}

 

Вывод:

MergeSort рекурсивным методом
1
2
3
4
5
6
7
8
9

Обновлено: 07.01.2020 — 15:04

2 комментария

Оставить комментарий
  1. пххаха, чел харош, взял код с другого сайта и переименовал классы. красавчег, я оценил)0))

    1. А тебя не смущает что реализация алгоритма не может быть иной, если ее придумали и описали математики? Можно заменить часть кода Linq но от этого код не станет ясней.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.