Реализация карманной (блочной) сортировки - C#

Узнай цену своей работы

Формулировка задачи:

Пытаюсь реализовать на C# карманную сортировку. Суть алгоритма в том, чтобы разложить входной масив из N елементов в N карманов на отрезке [0, 1) Кормен предлагает реализацию с помощью списков. Я пока что так не умею, поэтому решил использовать двумерный рванный массив. Однако, я не могу понять сам этап разложения. Ни википедия, ни кормен, мне так и не подсказали, по какому алгоритму следует записывать эти числа в спомагательный массив. Или может это я такой тугой?
Листинг программы
  1. void BucketSort(int[] A)
  2. {
  3. int k = 0;
  4. int n = A.Length;
  5. int [][] B = new int[n][];
  6. for (int i = 0; i <n; i++)
  7. //нужно вставить А[i] в масcив B
  8. for (int i = 0; i<n;i++)
  9. Array.Sort(B[i]);
  10. for (int i = 0; i < n; i++)
  11. for (int j = 0; j < B[i].Length; j++)
  12. A[k++] = B[i][j++];
  13. }

Решение задачи: «Реализация карманной (блочной) сортировки»

textual
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3.  
  4. namespace ConsoleApp1
  5. {
  6.     class Program
  7.     {
  8.         static void BucketSort(int[] a)
  9.         {
  10.             // Примем, что количество корзин равно количеству элементов в массиве-источнике.
  11.             // Тогда:
  12.             // массив корзин
  13.             List<int>[] aux = new List<int>[a.Length];
  14.  
  15.             // каждую корзину проинициализировать
  16.             for (int i = 0; i < aux.Length; ++i)
  17.                 aux[i] = new List<int>();
  18.  
  19.             // найти диапазон значений в массиве-источнике
  20.             int minValue = a[0];
  21.             int maxValue = a[0];
  22.  
  23.             for (int i = 1; i < a.Length; ++i)
  24.             {
  25.                 if (a[i] < minValue)
  26.                     minValue = a[i];
  27.                 else if (a[i] > maxValue)
  28.                     maxValue = a[i];
  29.             }
  30.  
  31.             // эта величина будет использоваться a.Length раз, поэтому имеет смысл её сохранить.
  32.             double numRange = maxValue - minValue;
  33.  
  34.             for (int i = 0; i < a.Length; ++i)
  35.             {
  36.                 // вычисление индекса корзины
  37.                 int bcktIdx = (int)Math.Floor((a[i] - minValue) / numRange * (aux.Length - 1));
  38.  
  39.                 // добавление элемента в соответствующую корзину
  40.                 aux[bcktIdx].Add(a[i]);
  41.             }
  42.  
  43.             // сортировка корзин. Здесь я, для упрощения себе писанины, использую библиотечную сортировку
  44.             for (int i = 0; i < aux.Length; ++i)
  45.                 aux[i].Sort();
  46.  
  47.             // собираем отсортированные элементы обратно в массив-источник
  48.             int idx = 0;
  49.  
  50.             for (int i = 0; i < aux.Length; ++i)
  51.             {
  52.                 for (int j = 0; j < aux[i].Count; ++j)
  53.                     a[idx++] = aux[i][j];
  54.             }
  55.         }
  56.  
  57.         static void Main()
  58.         {
  59.             int[] arr = new int[15];
  60.             Random rnd = new Random();
  61.  
  62.             for (int i = 0; i < arr.Length; ++i)
  63.                 arr[i] = rnd.Next(-99, 100);
  64.  
  65.             Console.WriteLine(String.Join(" ", arr));
  66.             BucketSort(arr);
  67.             Console.WriteLine(String.Join(" ", arr));
  68.         }
  69.     }
  70. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 3.923 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут