Advertisement
m1okgoodyes

SortHeap(пирамидальная)

Apr 9th, 2022
1,035
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 2.69 KB | None | 0 0
  1. // Реализация пирамидальной сортировки на C#
  2. using System;
  3.  
  4. public class HeapSort
  5. {
  6.     public void sort(int[] arr)
  7.     {
  8.         int n = arr.Length;
  9.  
  10.         // Построение кучи (перегруппируем массив)
  11.         for (int i = n / 2 - 1; i >= 0; i--)
  12.             heapify(arr, n, i);
  13.  
  14.         // Один за другим извлекаем элементы из кучи
  15.         for (int i = n - 1; i >= 0; i--)
  16.         {
  17.             // Перемещаем текущий корень в конец
  18.             int temp = arr[0];
  19.             arr[0] = arr[i];
  20.             arr[i] = temp;
  21.  
  22.             // вызываем процедуру heapify на уменьшенной куче
  23.             heapify(arr, i, 0);
  24.         }
  25.     }
  26.  
  27.     // Процедура для преобразования в двоичную кучу поддерева с корневым узлом i, что является
  28.     // индексом в arr[]. n - размер кучи
  29.  
  30.     void heapify(int[] arr, int n, int i)
  31.     {
  32.         int largest = i;
  33.         // Инициализируем наибольший элемент как корень
  34.         int l = 2 * i + 1; // left = 2*i + 1
  35.         int r = 2 * i + 2; // right = 2*i + 2
  36.  
  37.         // Если левый дочерний элемент больше корня
  38.         if (l < n && arr[l] > arr[largest])
  39.             largest = l;
  40.  
  41.         // Если правый дочерний элемент больше, чем самый большой элемент на данный момент
  42.         if (r < n && arr[r] > arr[largest])
  43.             largest = r;
  44.  
  45.         // Если самый большой элемент не корень
  46.         if (largest != i)
  47.         {
  48.             int swap = arr[i];
  49.             arr[i] = arr[largest];
  50.             arr[largest] = swap;
  51.  
  52.             // Рекурсивно преобразуем в двоичную кучу затронутое поддерево
  53.             heapify(arr, n, largest);
  54.         }
  55.     }
  56.  
  57.     /* Вспомогательная функция для вывода на экран массива размера n */
  58.     static void printArray(int[] arr)
  59.     {
  60.         int n = arr.Length;
  61.         for (int i = 0; i < n; ++i)
  62.             Console.Write(arr[i] + " ");
  63.         Console.Read();
  64.     }
  65.  
  66.     //Управляющая программа
  67.     public static void Main()
  68.     {
  69.         int[] arr = { 12, 11, 13, 5, 6, 7 };
  70.         int n = arr.Length;
  71.  
  72.         HeapSort ob = new HeapSort();
  73.         ob.sort(arr);
  74.  
  75.         Console.WriteLine("Sorted array is");
  76.         printArray(arr);
  77.     }
  78. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement