冒泡,选择,希尔,快速排序算法比较

mac2025-07-26  4

package com.kkgs.sort; import java.util.Arrays; /** * 排序算法的实现及其总结 * @author KKGS * */ /******************************************************************************************************************************* * 平均时间复杂度 稳定性 适用场景 * * 冒泡排序 n² 稳定 数据量较小 | 且当数组基本有序 | 同时要求稳定性时 * * 插入排序 n² 稳定 对要求稳定性 * * 希尔排序 n^1.3 不稳定 数据量较大(效率与设置的增量值有关系) | 不要求稳定性 * * 快速排序 nlogn 不稳定 数据量较大时,性能较为优越 (但是与选取的中间值关系比较大)| 不要求稳定性 * * * *******************************************************************************************************************************/ public class SortDemo { /** * 冒泡排序:平均时间复杂度为n²,稳定。 实现起来比较简单,如果数据量比较小且 对稳定性有要求的话,比较适合使用冒泡排序。但是如果是大数据量使用冒泡排序比较的话性能会非常差。 * * @param arr 传入的待排序数组 */ public static void bubbleSort(int[] arr) { for (int i = 1; i < arr.length; i++) { for (int j = 0; j < arr.length - i; j++) { //当后面的数字小于前面的数字时,进行交换 if (arr[j] > arr[j + 1]) { int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } } /** * 优化后的冒泡: 对于数据已经是有序的情况和后面一份部分数据的有序数据这两种情况进行了优化。 * * @param arr 传入的待排序数组 */ public static void optimizateBubbleSort(int[] arr) { boolean flag = true; int last_change = 0; int border_change = arr.length - 1; for (int i = 1; i < arr.length; i++) { for (int j = 0; j < border_change; j++) { if (arr[j] > arr[j + 1]) { int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; flag = false; last_change = j; } } border_change = last_change; if (flag) { break; } } } /** * 插入排序 平均时间复杂度为n²,稳定。 * * @param arr 传入的待排序数组 */ public static void selectSort(int[] arr) { for (int i = 0; i < arr.length - 1; i++) { int temp = arr[i + 1]; int index = i; while (index >= 0 && arr[index] > temp) { arr[index + 1] = arr[index]; index--; } arr[index + 1] = temp; } } /** * 希尔排序:其是内部比较使用的是插入排序,引入了增量,对特定列分别进行了插入排序。其时间复杂度与选取的增量有关。 * * @param arr 传入的待排序数组 * @param increments 增量数组 */ public static void shellSort(int[] arr, int[] increments) { //遍历增量数组 for (int index = 0; index < increments.length; index++) { //增量值 int incrementCount = increments[index]; for (int increment = 0; increment < incrementCount; increment++) { //插入排序 for (int i = increment; i < arr.length - incrementCount; i += incrementCount) { int temp = arr[i + incrementCount]; int j = i; while (j >= 0 && arr[j] > temp) { arr[j + incrementCount] = arr[j]; j -= incrementCount; } arr[j + incrementCount] = temp; } } } } /** * 快速排序:时间复杂度为nlogn,其时间复杂度与选择的中间值有关系。 * * @param arr 传入的待排序数组 * @param low 比较范围的起始位置 * @param high 比较范围的结束位置 */ public static void quickSort(int[] arr, int low, int high) { int begin = low; int end = high; //选取起始位置的值为中间值 int temp = arr[low]; while (begin < end) { while (begin < end && arr[end] > temp) { end--; } if (begin < end) { arr[begin] = arr[end]; begin++; } while (begin < end && arr[begin] < temp) { begin++; } if (begin < end) { arr[end] = arr[begin]; end--; } } //将中间值填入 arr[begin] = temp; if (begin > 0) { quickSort(arr, 0, begin - 1); } if (begin < high) { quickSort(arr, begin + 1, high); } } public static void main(String[] args) { int[] arr = { 9999, 123, 45, 12, 4643, 12, 32, 55, 56 }; // int[] arr = { 9999, 123, 45, 12, 4643, 12, 32, 55, 56,123, 45, 12, 4643, 12, 32, 55, 56,123, 45, 12, 4643, 12, 32, 55, 56, // 9999, 123, 45, 12, 4643, 12, 32, 55, 56,123, 45, 12, 4643, 12, 32, 55, 56,123, 45, 12, 4643, 12, 32, 55, 56, // 9999, 123, 45, 12, 4643, 12, 32, 55, 56,123, 45, 12, 4643, 12, 32, 55, 56,123, 45, 12, 4643, 12, 32, 55, 56, // 9999, 123, 45, 12, 4643, 12, 32, 55, 56,123, 45, 12, 4643, 12, 32, 55, 56,123, 45, 12, 4643, 12, 32, 55, 56, // 9999, 123, 45, 12, 4643, 12, 32, 55, 56,123, 45, 12, 4643, 12, 32, 55, 56,123, 45, 12, 4643, 12, 32, 55, 56, // 9999, 123, 45, 12, 4643, 12, 32, 55, 56,123, 45, 12, 4643, 12, 32, 55, 56,123, 45, 12, 4643, 12, 32, 55, 56, // 9999, 123, 45, 12, 4643, 12, 32, 55, 56,123, 45, 12, 4643, 12, 32, 55, 56,123, 45, 12, 4643, 12, 32, 55, 56, // 9999, 123, 45, 12, 4643, 12, 32, 55, 56,123, 45, 12, 4643, 12, 32, 55, 56,123, 45, 12, 4643, 12, 32, 55, 56, // 9999, 123, 45, 12, 4643, 12, 32, 55, 56,123, 45, 12, 4643, 12, 32, 55, 56,123, 45, 12, 4643, 12, 32, 55, 56, // 9999, 123, 45, 12, 4643, 12, 32, 55, 56,123, 45, 12, 4643, 12, 32, 55, 56,123, 45, 12, 4643, 12, 32, 55, 56, // 9999, 123, 45, 12, 4643, 12, 32, 55, 56,123, 45, 12, 4643, 12, 32, 55, 56,123, 45, 12, 4643, 12, 32, 55, 56, // 9999, 123, 45, 12, 4643, 12, 32, 55, 56,123, 45, 12, 4643, 12, 32, 55, 56,123, 45, 12, 4643, 12, 32, 55, 56, // 9999, 123, 45, 12, 4643, 12, 32, 55, 56,123, 45, 12, 4643, 12, 32, 55, 56,123, 45, 12, 4643, 12, 32, 55, 56, // 9999, 123, 45, 12, 4643, 12, 32, 55, 56,123, 45, 12, 4643, 12, 32, 55, 56,123, 45, 12, 4643, 12, 32, 55, 56, // 9999, 123, 45, 12, 4643, 12, 32, 55, 56,123, 45, 12, 4643, 12, 32, 55, 56,123, 45, 12, 4643, 12, 32, 55, 56, // 9999, 123, 45, 12, 4643, 12, 32, 55, 56,123, 45, 12, 4643, 12, 32, 55, 56,123, 45, 12, 4643, 12, 32, 55, 56, // 9999, 123, 45, 12, 4643, 12, 32, 55, 56,123, 45, 12, 4643, 12, 32, 55, 56,123, 45, 12, 4643, 12, 32, 55, 56, // 9999, 123, 45, 12, 4643, 12, 32, 55, 56,123, 45, 12, 4643, 12, 32, 55, 56,123, 45, 12, 4643, 12, 32, 55, 56, // 9999, 123, 45, 12, 4643, 12, 32, 55, 56,123, 45, 12, 4643, 12, 32, 55, 56,123, 45, 12, 4643, 12, 32, 55, 56, // 9999, 123, 45, 12, 4643, 12, 32, 55, 56,123, 45, 12, 4643, 12, 32, 55, 56,123, 45, 12, 4643, 12, 32, 55, 56, // 9999, 123, 45, 12, 4643, 12, 32, 55, 56,123, 45, 12, 4643, 12, 32, 55, 56,123, 45, 12, 4643, 12, 32, 55, 56, // 9999, 123, 45, 12, 4643, 12, 32, 55, 56,123, 45, 12, 4643, 12, 32, 55, 56,123, 45, 12, 4643, 12, 32, 55, 56, // 9999, 123, 45, 12, 4643, 12, 32, 55, 56,123, 45, 12, 4643, 12, 32, 55, 56,123, 45, 12, 4643, 12, 32, 55, 56,}; long startTime = System.currentTimeMillis(); bubbleSort(arr); long endTime = System.currentTimeMillis(); System.out.println("冒泡时间差:"+(endTime-startTime)); long startTime2 = System.currentTimeMillis(); optimizateBubbleSort(arr); long endTime2 = System.currentTimeMillis(); System.out.println("优化后的冒泡排序时间差:"+(endTime2-startTime2)); long startTime1 = System.currentTimeMillis(); selectSort(arr); long endTime1 = System.currentTimeMillis(); System.out.println("选择排序时间差:"+(endTime1-startTime1)); long startTime3 = System.currentTimeMillis(); quickSort(arr, 0, arr.length-1); int[] increments = { 4, 1 }; long endTime3 = System.currentTimeMillis(); System.out.println("快速时间差:"+(endTime3-startTime3)); long startTime4 = System.currentTimeMillis(); shellSort(arr, increments); long endTime4 = System.currentTimeMillis(); System.out.println("希尔时间差:"+(endTime4-startTime4)); } }
最新回复(0)