C, PHP, VB, .NET

Дневникът на Филип Петров


* Някои популярни алгоритми за сортиране, реализирани на Java

Публикувано на 06 декември 2024 в раздел ПИК3 Java.

Кодът по-долу представя основни алгоритми за сортирани. Реализацията им е на Java. Правени са в учебна среда - възможно е да има допуснати неточности и грешки.

static void selectionSort(int[] arr) {
  int min_index;
  for (int i = 0; i < arr.length - 1; i++) {
   min_index = i;
   for (int j = i + 1; j < arr.length; j++) {
    if (arr[j] < arr[min_index]) {
     min_index = j;
    }
   }
   int temp = arr[i];
   arr[i] = arr[min_index];
   arr[min_index] = temp;
  }
}

static void bubbleSortUnoptimized(int arr[]) {
  for (int i = 0; i < arr.length - 1; i++) {
   for (int j = 0; j < arr.length - i - 1; j++) {
    if (arr[j] > arr[j + 1]) {
     int temp = arr[j];
     arr[j] = arr[j + 1];
     arr[j + 1] = temp;
    }
   }
  }
}

static void bubbleSort(int arr[]) {
  boolean swapDone;
  for (int i = 0; i < arr.length - 1; i++) {
   swapDone = false;
   for (int j = 0; j < arr.length - i - 1; j++) {
    if (arr[j] > arr[j + 1]) {
     int temp = arr[j];
     arr[j] = arr[j + 1];
     arr[j + 1] = temp;
     swapDone = true;
    }
   }
   if (swapDone == false) {
    return;
   }
  }
}

static void mergeSort(int[] arr) {
  if (arr.length < 2) {
   return;
  }
  int mid = arr.length / 2;
  int[] leftPart = new int[mid];
  int[] rightPart = new int[arr.length - mid];

  for (int i = 0; i < mid; i++) {
   leftPart[i] = arr[i];
  }
  for (int i = mid; i < arr.length; i++) {
   rightPart[i - mid] = arr[i];
  }
  mergeSort(leftPart);
  mergeSort(rightPart);

  int i = 0, j = 0, k = 0;
  while (i < mid && j < arr.length - mid) {
   if (leftPart[i] <= rightPart[j]) {
    arr[k] = leftPart[i];
    k++;
    i++;
   } else {
    arr[k] = rightPart[j];
    k++;
    j++;
   }
  }
  while (i < mid) {
   arr[k] = leftPart[i];
   k++;
   i++;
  }
  while (j < arr.length - mid) {
   arr[k] = rightPart[j];
   k++;
   j++;
  }
}

static void quickSort(int[] array) {
  class LocalClass {

   void quickSortRec(int[] arr, int lowIndex, int highIndex) {
    if (lowIndex >= highIndex) {
     return;
    }
    int pivotIndex = new java.util.Random().nextInt(highIndex - lowIndex) + lowIndex;
    int pivot = array[pivotIndex];
    int temp = array[pivotIndex];
    array[pivotIndex] = array[highIndex];
    array[highIndex] = temp;

    int leftPointer = lowIndex;
    int rightPointer = highIndex - 1;

    while (leftPointer < rightPointer) {
     while (array[leftPointer] <= pivot && leftPointer < rightPointer) {
      leftPointer++;
     }
     while (array[rightPointer] >= pivot && leftPointer < rightPointer) {
      rightPointer--;
     }
     temp = array[leftPointer];
     array[leftPointer] = array[rightPointer];
     array[rightPointer] = temp;
    }

    if (array[leftPointer] > array[highIndex]) {
     temp = array[leftPointer];
     array[leftPointer] = array[highIndex];
     array[highIndex] = temp;
    } else {
     leftPointer = highIndex;
    }

    quickSortRec(array, lowIndex, leftPointer - 1);
    quickSortRec(array, leftPointer + 1, highIndex);
   }
  }
  new LocalClass().quickSortRec(array, 0, array.length - 1);
}

static void insertionSort(int arr[]) {
  for (int i = 1; i < arr.length; i++) {
   int temp = arr[i];
   int j;
   for (j = i - 1; j >= 0 && arr[j] > temp; j--) {
    arr[j + 1] = arr[j];
   }
   arr[j + 1] = temp;
  }
}

static void countSort(int arr[]) {
  int max = arr[0];
  for (int i = 1; i < arr.length; i++) {
   if (arr[i] > max) {
    max = arr[i];
   }
  }
  
  int[] countingArr = new int[max + 1];
  for (int i = 0; i < arr.length; i++) {
   countingArr[arr[i]]++;
  }
  for (int i = 1; i <= max; i++) {
   countingArr[i] += countingArr[i - 1];
  }

  int[] sortedArr = new int[arr.length + 1];
  for (int i = arr.length - 1; i >= 0; i--) {
   sortedArr[countingArr[arr[i]] - 1] = arr[i];
   countingArr[arr[i]]--;
  }

  System.arraycopy(sortedArr, 0, arr, 0, arr.length);
}
 
static void ranksSort(int[] arr){
  int[] ranks = new int[arr.length];
  for(int i=0; i<arr.length; i++){
   int i_rank = 0;
   int dups = 0;
   for(int j=0; j<arr.length; j++){
    if(arr[i]>arr[j]){
     i_rank++;
    }
    else if(arr[i] == arr[j] && i!=j){
     dups++;
    }
   }
   for(int k=0; k<=dups; k++, i_rank++){
    ranks[i_rank] = arr[i];
   }
  }
  System.arraycopy(ranks, 0, arr, 0, arr.length);
}

 



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

Адресът на електронната поща няма да се публикува


*