21xrx.com
2024-11-05 22:47:49 Tuesday
登录
文章检索 我的文章 写文章
Java实现复杂排序算法,让你的程序更优秀
2023-06-18 02:00:01 深夜i     --     --

在Java编程中,排序算法是一个常见而重要的问题。正确的排序算法可以提高程序运行效率,而复杂排序算法则是许多业务场景中必不可少的一部分。本文将为你介绍几种Java实现的复杂排序算法,并提供实际案例,帮助你让程序更优秀。

1. 基数排序

基数排序是一种非常适合处理数字序列的排序算法,特别是当数字序列具有相同位数时。它的核心思想是按照位数从高到低进行排序,最终得到有序的结果。

代码案例:


public static void radixSort(int[] arr) {

  if (arr == null || arr.length < 2)

    return;

  

  int max = Integer.MIN_VALUE;

  for (int i = 0; i < arr.length; i++) {

    max = Math.max(max, arr[i]);

  }

  int maxDigit = 0;

  while (max != 0) {

    max /= 10;

    maxDigit++;

  }

  int[][] buckets = new int[10][arr.length];

  int base = 1;

  for (int i = 0; i < maxDigit; i++) {

    int[] bucketIndex = new int[10];

    for (int j = 0; j < arr.length; j++) {

      int bucketNo = (arr[j] / base) % 10;

      buckets[bucketNo][bucketIndex[bucketNo]] = arr[j];

      bucketIndex[bucketNo]++;

    }

    int k = 0;

    for (int j = 0; j < 10; j++) {

      for (int l = 0; l < bucketIndex[j]; l++) {

        arr[k++] = buckets[j][l];

      }

    }

    base *= 10;

  }

}

2. 归并排序

归并排序是一种分治思想的排序算法,它将待排序序列分为两部分,然后分别对这两部分进行排序,最后将这两部分合并成一个有序序列。

代码案例:


public static void mergeSort(int[] arr) {

  if (arr == null || arr.length < 2)

    return;

  

  mergeSort(arr, 0, arr.length - 1);

}

private static void mergeSort(int[] arr, int left, int right) {

  if (left == right)

    return;

  

  int mid = left + ((right - left) >> 1);

  mergeSort(arr, left, mid);

  mergeSort(arr, mid + 1, right);

  merge(arr, left, mid, right);

}

private static void merge(int[] arr, int left, int mid, int right) {

  int[] help = new int[right - left + 1];

  int i = 0;

  int p1 = left;

  int p2 = mid + 1;

  while (p1 <= mid && p2 <= right) {

    help[i++] = arr[p1] < arr[p2] ? arr[p1++] : arr[p2++];

  }

  while (p1 <= mid) {

    help[i++] = arr[p1++];

  }

  while (p2 <= right) {

    help[i++] = arr[p2++];

  }

  for (i = 0; i < help.length; i++) {

    arr[left + i] = help[i];

  }

}

3. 快速排序

快速排序是一种基于分治思想的排序算法,它将待排序序列分为两部分,一部分比基准值小,另一部分比基准值大,然后递归处理这两部分。

代码案例:


public static void quickSort(int[] arr) {

  if (arr == null || arr.length < 2)

    return;

  

  quickSort(arr, 0, arr.length - 1);

}

private static void quickSort(int[] arr, int left, int right) {

  if (left >= right)

    return;

  

  int p = partition(arr, left, right);

  quickSort(arr, left, p - 1);

  quickSort(arr, p + 1, right);

}

private static int partition(int[] arr, int left, int right) {

  int pivot = arr[left];

  int i = left;

  int j = right;

  while (i < j) {

    while (i < j && arr[j] >= pivot)

      j--;

    

    arr[i] = arr[j];

    while (i < j && arr[i] <= pivot) {

      i++;

    }

    arr[j] = arr[i];

  }

  arr[i] = pivot;

  return i;

}

本文介绍的三种排序算法都可以实现Java优秀的程序,可以根据实际业务场景选择合适的算法。归并排序适用于一般排序,快速排序适用于大数据排序,而基数排序适用于大量数据排序和一些特殊排序场合。为实现Java程序优化,这三个关键词是:基数排序、归并排序、快速排序。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复