当前位置:   article > 正文

JAVA七种常见排序算法_java排序

java排序

前言: 排序算法在计算机科学中扮演着至关重要的角色,它们用于将无序数据变为有序数据,以便更有效地检索和处理信息。不同的排序算法适用于不同的情况,因此了解它们的工作原理和性能特点对于选择正确的算法至关重要。本文提供的Java示例代码有助于理解这些排序算法的基本原理和实现方式,以便在实际应用中选择合适的排序算法来提高效率。无论是面试准备还是实际开发中,对排序算法的理解都是非常有价值的知识。

1、冒泡排序(Bubble Sort): 冒泡排序是一种简单的比较排序算法,它重复地遍历待排序数组,比较相邻元素,并交换它们,直到整个数组有序为止。它的时间复杂度为O(n^2),不适用于大规模数据集。

  1. public static void bubbleSort(int[] arr) {
  2. int n = arr.length;
  3. for (int i = 0; i < n - 1; i++) {
  4. for (int j = 0; j < n - 1 - i; j++) {
  5. if (arr[j] > arr[j + 1]) {
  6. int temp = arr[j];
  7. arr[j] = arr[j + 1];
  8. arr[j + 1] = temp;
  9. }
  10. }
  11. }
  12. }

2、选择排序(Selection Sort): 选择排序也是一种简单的比较排序算法,它将数组分为已排序和未排序两部分,每次从未排序部分选择最小的元素并将其放入已排序部分。它的时间复杂度为O(n^2),不适用于大规模数据集。

  1. public static void selectionSort(int[] arr) {
  2. int n = arr.length;
  3. for (int i = 0; i < n - 1; i++) {
  4. int minIndex = i;
  5. for (int j = i + 1; j < n; j++) {
  6. if (arr[j] < arr[minIndex]) {
  7. minIndex = j;
  8. }
  9. }
  10. int temp = arr[i];
  11. arr[i] = arr[minIndex];
  12. arr[minIndex] = temp;
  13. }
  14. }

3、插入排序(Insertion Sort): 插入排序是一种简单的比较排序算法,它将数组分为已排序和未排序两部分,每次从未排序部分选择一个元素插入已排序部分的适当位置。它的时间复杂度为O(n^2),对于小型数据集和基本有序的数组性能较好。

  1. public static void insertionSort(int[] arr) {
  2. int n = arr.length;
  3. for (int i = 1; i < n; i++) {
  4. int key = arr[i];
  5. int j = i - 1;
  6. while (j >= 0 && arr[j] > key) {
  7. arr[j + 1] = arr[j];
  8. j--;
  9. }
  10. arr[j + 1] = key;
  11. }
  12. }

4、快速排序(Quick Sort): 快速排序是一种分而治之的比较排序算法,它选择一个基准元素,将数组分成两部分,左边的元素小于基准,右边的元素大于基准,然后递归地对这两部

分进行排序。它的平均时间复杂度为O(n log n),性能较好。

  1. public static void quickSort(int[] arr, int low, int high) {
  2. if (low < high) {
  3. int pivot = partition(arr, low, high);
  4. quickSort(arr, low, pivot - 1);
  5. quickSort(arr, pivot + 1, high);
  6. }
  7. }
  8. private static int partition(int[] arr, int low, int high) {
  9. int pivot = arr[high];
  10. int i = low - 1;
  11. for (int j = low; j < high; j++) {
  12. if (arr[j] < pivot) {
  13. i++;
  14. int temp = arr[i];
  15. arr[i] = arr[j];
  16. arr[j] = temp;
  17. }
  18. }
  19. int temp = arr[i + 1];
  20. arr[i + 1] = arr[high];
  21. arr[high] = temp;
  22. return i + 1;
  23. }

5、归并排序(Merge Sort): 归并排序也是一种分而治之的比较排序算法,它将数组分成两部分,分别对这两部分进行排序,然后将它们合并为一个有序数组。它的时间复杂度为O(n log n),性能稳定。

  1. public static void mergeSort(int[] arr) {
  2. if (arr.length > 1) {
  3. int mid = arr.length / 2;
  4. int[] left = Arrays.copyOfRange(arr, 0, mid);
  5. int[] right = Arrays.copyOfRange(arr, mid, arr.length);
  6. mergeSort(left);
  7. mergeSort(right);
  8. merge(arr, left, right);
  9. }
  10. }
  11. private static void merge(int[] arr, int[] left, int[] right) {
  12. int i = 0, j = 0, k = 0;
  13. while (i < left.length && j < right.length) {
  14. if (left[i] < right[j]) {
  15. arr[k] = left[i];
  16. i++;
  17. } else {
  18. arr[k] = right[j];
  19. j++;
  20. }
  21. k++;
  22. }
  23. while (i < left.length) {
  24. arr[k] = left[i];
  25. i++;
  26. k++;
  27. }
  28. while (j < right.length) {
  29. arr[k] = right[j];
  30. j++;
  31. k++;
  32. }
  33. }

6、堆排序(Heap Sort): 堆排序是一种选择排序,它使用二叉堆数据结构来进行排序。它的基本思想是将待排序的数组构建成一个最大堆(或最小堆),然后将堆顶元素与堆底元素交换,从堆中移除最大(或最小)元素,并递减堆的大小,重复这个过程直到堆为空。它的时间复杂度为O(n log n),性能稳定。

  1. public static void heapSort(int[] arr) {
  2. int n = arr.length;
  3. // 构建最大堆
  4. for (int i = n / 2 - 1; i >= 0; i--) {
  5. heapify(arr, n, i);
  6. }
  7. // 依次取出堆顶元素并调整堆
  8. for (int i = n - 1; i > 0; i--) {
  9. int temp = arr[0];
  10. arr[0] = arr[i];
  11. arr[i] = temp;
  12. heapify(arr, i, 0);
  13. }
  14. }
  15. private static void heapify(int[] arr, int n, int i) {
  16. int largest = i;
  17. int left = 2 * i + 1;
  18. int right = 2 * i + 2;
  19. if (left < n && arr[left] > arr[largest]) {
  20. largest = left;
  21. }
  22. if (right < n && arr[right] > arr[largest]) {
  23. largest = right;
  24. }
  25. if (largest != i) {
  26. int swap = arr[i];
  27. arr[i] = arr[largest];
  28. arr[largest] = swap;
  29. heapify(arr, n, largest);
  30. }
  31. }

 

7、基数排序(Radix Sort): 基数排序是一种非比较排序算法,它根据元素的位数进行排序。它将待排序的元素分成多个桶,然后按照位数的顺序依次对每个桶进行排序。它可以用于整数或字符串的排序。基数排序的时间复杂度取决于元素的位数和桶的数量,通常为O(n * k),其中n是元素数量,k是位数。

  1. public static void radixSort(int[] arr) {
  2. int max = Arrays.stream(arr).max().getAsInt();
  3. int exp = 1;
  4. while (max / exp > 0) {
  5. countingSort(arr, exp);
  6. exp *= 10;
  7. }
  8. }
  9. private static void countingSort(int[] arr, int exp) {
  10. int n = arr.length;
  11. int[] output = new int[n];
  12. int[] count = new int[10];
  13. for (int i = 0; i < n; i++) {
  14. count[(arr[i] / exp) % 10]++;
  15. }
  16. for (int i = 1; i < 10; i++) {
  17. count[i] += count[i - 1];
  18. }
  19. for (int i = n - 1; i >= 0; i--) {
  20. output[count[(arr[i] / exp) % 10] - 1] = arr[i];
  21. count[(arr[i] / exp) % 10]--;
  22. }
  23. for (int i = 0; i < n; i++) {
  24. arr[i] = output[i];
  25. }
  26. }

总结:冒泡排序、选择排序和插入排序是最基本的排序算法,适用于小型数据集或作为排序算法的基础。快速排序和归并排序是分而治之的排序算法,适用于中等规模数据集,性能良好。堆排序是一种选择排序,适用于大规模数据集,性能稳定。基数排序是非比较排序算法,适用于整数或字符串排序。 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/941499
推荐阅读
相关标签
  

闽ICP备14008679号