Advertisement
Guest User

Untitled

a guest
Jun 24th, 2018
156
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.54 KB | None | 0 0
  1. package App.Model;
  2.  
  3. import java.util.List;
  4. import java.util.Vector;
  5.  
  6. public class HeapSorter
  7. {
  8.     private long time = 0;
  9.     public long getTime() { return time; }
  10.  
  11.     private long exchanges = 0;
  12.     public long getExchanges() { return exchanges; }
  13.  
  14.     private long comparison = 0;
  15.     public long getComparison() { return comparison; }
  16.  
  17.     public HeapSorter() { }
  18.  
  19.     /**
  20.      * Демонстрационный алгоритм для пирамидальной сортировки
  21.      * Авторы алгорифма - J. W. J. Williams и R. W. Floyd
  22.      *
  23.      * SortAlgorithm.java, Thu Oct 27 10:32:35 1994
  24.      *
  25.      * @author Jason Harrison@cs.ubc.ca
  26.      * @version 1.0, 23 Jun 1995
  27.      */
  28.  
  29.     public void sort(int a[]) throws Exception {
  30.  
  31.         time = 0;
  32.         exchanges = 0;
  33.         comparison = 0;
  34.  
  35.         long startTime = System.currentTimeMillis();
  36.  
  37.         int N = a.length;
  38.         //Создаём из массива сортирующее дерево
  39.         //Максимальный элемент окажется в корне.
  40.         for (int k = N / 2; k > 0; k--) downheap(a, k, N);
  41.         //Избавляемся от максимумов
  42.         //и перетряхиваем сортирующее дерево
  43.         do {
  44.             //Меняем максимум с последним элементом...
  45.             int T = a[0];
  46.             a[0] = a[N - 1]; exchanges++; //TODO ОБМЕН
  47.             a[N - 1] = T;
  48.             //... и перестравиваем сортирующее дерево
  49.             //для неотсортированной части массива
  50.             N = N - 1;
  51.             downheap(a, 1, N);
  52.         } while (N > 1); //До последнего элемента
  53.  
  54.         long stopTime = System.currentTimeMillis();
  55.         time = stopTime - startTime;
  56.     }
  57.  
  58.     //Просматриваем ветку и в её корень перемещаем крупнейший узел
  59.     private void downheap(int a[], int k, int N) throws Exception {
  60.         //В корне поддерева
  61.         //запоминаем родителя
  62.         int T = a[k - 1];
  63.         //Смотрим потомков в пределах ветки
  64.         while (k <= N / 2) {
  65.             int j = k + k;//Левый потомок
  66.             //Если есть правый потомок,
  67.             //то сопоставляем его с левым
  68.             //и из них выбираем крупнейший
  69.             comparison++; //TODO СРАВНЕНИЕ
  70.             if ((j < N) && (a[j - 1] < a[j])) j++;
  71.             //Если родитель огромнее (либо равен) наибольшего потомка
  72.             //то значит всё в порядке в этой ветке
  73.             comparison++; //TODO СРАВНЕНИЕ
  74.             if (T >= a[j - 1]) break;
  75.             else { //Если родитель поменьше наибольшего потомка...
  76.                 //... то потомок становится на место родителя
  77.                 a[k - 1] = a[j - 1]; exchanges++; //TODO ОБМЕН
  78.                 k = j;
  79.             }
  80.         }
  81.         //Родитель в результате меняется местами с наибольшим из потомков
  82.         //(либо остаётся на своём месте, если все потомки поменьше его)
  83.         a[k - 1] = T; exchanges++; //TODO ОБМЕН
  84.     }
  85. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement