1. 程式人生 > >十大經典排序演算法(Java實現)

十大經典排序演算法(Java實現)


import java.util.ArrayList;
import java.util.Arrays;

/**
 * @author lollipop
 * @email [email protected]
 * @date 2018/11/22 0022 8:36
 */
public class SortDemo {
    private static int[] array = {-8, 9, 3, -7, 6, 0, -8, 9, -6, 0, 7, -2};
    private static Integer[] array1 = {18, 93, 43, 7, 346,
0, 2458, 9, 623, 0, 72, 82}; public static void main(String[] args) { // bubbleSort(array); // selectionSort(array); // insertionSort(array); // shellSort(array); // System.out.println(Arrays.toString(mergeSort(array))); // quickSort(array, 0, array.length - 1); // heapSort(array);
// countSort(array); // ArrayList<Integer> list = new ArrayList<>(); // Collections.addAll(list, array1); // System.out.println(bucketSort(list, 10)); // radixSort(array1); // System.out.println(Arrays.toString(array1)); // System.out.println(Arrays.toString(array));
} /** * 交換資料中的兩個元素 * * @param array 資料 * @param i 下標1 * @param j 下標2 */ public static void swap(int[] array, int i, int j) { if (array[i] != array[j]) { array[i] ^= array[j]; array[j] ^= array[i]; array[i] ^= array[j]; } } /** * 氣泡排序 * 穩定 * * @param array 要排序的陣列 */ public static void bubbleSort(int[] array) { if (array == null || array.length < 2) { return; } for (int i = 0; i < array.length; i++) { //將最大的數冒泡到最後面 for (int j = 0; j < array.length - i - 1; j++) { if (array[j + 1] < array[j]) { swap(array, j, j + 1); } } } } /** * 選擇排序 * 不穩定 * * @param array 要排序的陣列 */ public static void selectionSort(int[] array) { if (array == null || array.length < 2) { return; } for (int i = 0; i < array.length; i++) { int minIndex = i; for (int j = i; j < array.length; j++) { minIndex = array[j] < array[minIndex] ? j : minIndex; } swap(array, i, minIndex); } } /** * 插入排序法 * 穩定 * * @param array 要排序的陣列 */ public static void insertionSort(int[] array) { if (array == null || array.length < 2) { return; } for (int i = 1; i < array.length; i++) { int current = array[i]; int preIndex = i - 1; while (preIndex >= 0 && current < array[preIndex]) { array[preIndex + 1] = array[preIndex]; preIndex--; } array[preIndex + 1] = current; } } /** * 希爾排序 * * @param array 要排序的陣列 */ public static void shellSort(int[] array) { if (array == null || array.length < 2) { return; } for (int gap = array.length >> 1; gap >= 1; gap >>= 1) { for (int i = gap; i < array.length; i++) { int current = array[i]; int preIndex = i - gap; while (preIndex >= 0 && array[preIndex] > current) { array[preIndex + gap] = array[preIndex]; preIndex -= gap; } array[preIndex + gap] = current; } } } /** * 歸併排序 * 穩定 * * @param array 要排序的陣列 * @return 將array中資料排序後的陣列 */ public static int[] mergeSort(int[] array) { if (array == null || array.length < 2) { return array; } int mid = array.length >> 1; return merge(mergeSort(Arrays.copyOfRange(array, 0, mid)), mergeSort(Arrays.copyOfRange(array, mid, array.length))); } /** * 歸併排序的合併左右子陣列的操作 * * @param left 左陣列 * @param right 右陣列 * @return 返回合併後的陣列 */ private static int[] merge(int[] left, int[] right) { int[] result = new int[left.length + right.length]; for (int i = 0, l = 0, r = 0; i < result.length; i++) { if (l == left.length) { result[i] = right[r++]; } else if (r == right.length) { result[i] = left[l++]; } else { result[i] = left[l] < right[r] ? left[l++] : right[r++]; } } return result; } /** * 快速排序 * 不穩定 * * @param array 要排序的陣列 * @param start 起始位置 * @param end 結束位置 */ public static void quickSort(int[] array, int start, int end) { if (array == null || array.length < 2 || start < 0 || end >= array.length || start >= end) { return; } int pivotalIndex = partition(array, start, end); quickSort(array, start, pivotalIndex - 1); quickSort(array, pivotalIndex + 1, end); } /** * 快速排序的按照基準排序操作 * * @param array 要排序的陣列 * @param start 起始位置 * @param end 結束位置 * @return 返回排序後基準值的下標 */ private static int partition(int[] array, int start, int end) { int pivot = array[start]; int i = start; for (int j = start + 1; j <= end; j++) { if (array[j] < pivot) { swap(array, ++i, j); } } swap(array, start, i); return i; } //宣告全域性變數,用於記錄陣列array的長度; private static int len; /** * 堆排序 * 不穩定 * * @param array 要排序的陣列 */ public static void heapSort(int[] array) { if (array == null || (len = array.length) < 2) { return; } //1.構建一個最大堆 buildMaxHeap(array); //2.迴圈將堆首位(最大值)與末位交換,然後在重新調整最大堆 while (len > 0) { swap(array, 0, len - 1); len--; adjustHeap(array, 0); } } /** * 建立最大堆 * * @param array 要排序的陣列 */ private static void buildMaxHeap(int[] array) { //從最後一個非葉子節點開始向上構造最大堆 for (int i = (len - 1) >> 1; i >= 0; i--) { adjustHeap(array, i); } } /** * 調整使之成為最大堆 * * @param array 要排序的陣列 * @param i 要調整的子樹根節點 */ private static void adjustHeap(int[] array, int i) { int maxIndex = i; //如果有左子樹,且左子樹大於父節點,則將最大指標指向左子樹 if (i << 1 < len && array[i << 1] > array[maxIndex]) maxIndex = i << 1; //如果有右子樹,且右子樹大於父節點,則將最大指標指向右子樹 if ((i << 1) + 1 < len && array[(i << 1) + 1] > array[maxIndex]) maxIndex = (i << 1) + 1; //如果父節點不是最大值,則將父節點與最大值交換,並且遞迴調整與父節點交換的位置。 if (maxIndex != i) { swap(array, maxIndex, i); adjustHeap(array, maxIndex); } } /** * 計數排序 * 穩定 * * @param array 要排序的陣列 */ public static void countSort(int[] array) { if (array == null || array.length < 2) { return; } int min = array[0], max = array[0]; for (int i = 1; i < array.length; i++) { max = max > array[i] ? max : array[i]; min = min < array[i] ? min : array[i]; } int[] bucket = new int[max - min + 1]; for (int anArray : array) { bucket[anArray - min]++; } for (int i = 0, j = 0; j < array.length; ) { if (bucket[i] > 0) { array[j++] = i + min; bucket[i]--; } else { i++; } } } /** * 桶排序 * 穩定 * * @param array 要排序的集合 * @param bucketSize 桶的容量 */ public static ArrayList<Integer> bucketSort(ArrayList<Integer> array, int bucketSize) { if (array == null || array.size() < 2 || bucketSize < 1) { return array; } int max = array.get(0), min = array.get(0); // 找到最大值最小值 for (Integer anArray1 : array) { if (anArray1 > max) max = anArray1; if (anArray1 < min) min = anArray1; } int bucketCount = (max - min) / bucketSize + 1; ArrayList<ArrayList<Integer>> bucketArr = new ArrayList<>(bucketCount); ArrayList<Integer> resultArr = new ArrayList<>(); for (int i = 0; i < bucketCount; i++) { bucketArr.add(new ArrayList<>()); } for (Integer anArray : array) { bucketArr.get((anArray - min) / bucketSize).add(anArray); } for (int i = 0; i < bucketCount; i++) { if (bucketCount == 1) { bucketSize--; } ArrayList<Integer> temp = bucketSort(bucketArr.get(i), bucketSize); resultArr.addAll(temp); } return resultArr; } /** * 基數排序 * 穩定 * * @param array 要排序的陣列 */ public static void radixSort(Integer[] array) { if (array == null || array.length < 2) { return; } // 1.先算出最大數的位數; int max = array[0]; for (int i = 1; i < array.length; i++) { max = Math.max(max, array[i]); } int maxDigit = 0; while (max != 0) { max /= 10; maxDigit++; } int mod = 10, div = 1; ArrayList<ArrayList<Integer>> bucketList = new ArrayList<>(); for (int i = 0; i < 10; i++) { bucketList.add(new ArrayList<>()); } for (int i = 0; i < maxDigit; i++, mod *= 10, div *= 10) { for (int anArray : array) { int num = (anArray % mod) / div; bucketList.get(num).add(anArray); } int index = 0; for (ArrayList<Integer> aBucketList : bucketList) { for (Integer anABucketList : aBucketList) { array[index++] = anABucketList; } aBucketList.clear(); } } } }