常见排序算法

mac2025-06-03  33

文章目录

冒泡排序插入排序快速排序选择排序归并排序堆排序计数排序

冒泡排序

public class BubbleSort { /** * 冒泡排序:时间复杂度为O(n^2) */ public static void bubbleSort(int[] arr) { if (arr == null || arr.length < 2) { return; } for (int e = arr.length - 1; e > 0; e--) { for (int i = 0; i < e; i++) { if (arr[i] > arr[i + 1]) { swap(arr, i, i + 1); } } } } public static void swap(int[] arr, int i, int j) { int tmp; tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; } public static void main(String[] args) { int[] arr = { 2, 3, 6, 1, 8, 5, 5, 6, 0 }; bubbleSort(arr); for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); } } }

插入排序

public class InsertionSort { /** * 插入排序:时间复杂度为O(n^2) */ public static void insertionSort(int[] arr) { if (arr == null || arr.length < 2) { return; } for (int i = 1; i < arr.length; i++) { for (int j = i - 1; j >= 0 && arr[j] > arr[j + 1]; j--) { swap(arr, j, j + 1); } } } public static void swap(int[] arr, int i, int j) { int tmp; tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; } public static void main(String[] args) { int[] arr = { 2, 3, 6, 1, 8, 5, 5, 6, 0 }; insertionSort(arr); for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); } } }

快速排序

public class QuickSort { public static void quickSort(int[] arr, int l, int r) { if (arr == null || arr.length < 2) { return; } if (l < r) { swap(arr, l + (int) Math.random() * (r - l + 1), r); int[] p = partition(arr, l, r); quickSort(arr, l, p[0] - 1); quickSort(arr, p[1] + 1, r); } } public static int[] partition(int[] arr, int l, int r) { int less = l - 1; int more = r; while (l < more) { if (arr[l] < arr[r]) { swap(arr, ++less, l++); } else if (arr[l] > arr[r]) { swap(arr, --more, l); } else { l++; } } swap(arr, more, r); return new int[] { less + 1, more }; } public static void swap(int[] arr, int i, int j) { int tmp; tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; } public static void main(String[] args) { int[] arr = { 2, 3, 6, 1, 8, 5, 5, 6, 0 }; quickSort(arr, 0, arr.length - 1); for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); } } }

选择排序

public class SelectSort { /** * 选择排序:时间复杂度为O(n^2) */ public static void selectSort(int[] arr) { if (arr == null || arr.length < 2) { return; } for (int i = 0; i < arr.length - 1; i++) { int minIndex = i; for (int j = i + 1; j < arr.length; j++) { minIndex = arr[j] < arr[minIndex] ? j : minIndex; } swap(arr, i, minIndex); } } public static void swap(int[] arr, int i, int j) { int tmp; tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; } public static void main(String[] args) { int[] arr = { 2, 3, 6, 1, 8, 5, 5, 6, 0 }; selectSort(arr); for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); } } }

归并排序

public class MergeSort { /** * 归并排序:时间复杂度为O(n*logn) */ public static void mergeSort(int[] arr, int l, int r) { if (arr == null || arr.length < 2 || l == r) { return; } int mid = l + ((r - l) >> 2); mergeSort(arr, l, mid); mergeSort(arr, mid + 1, r); merge(arr, l, mid, r); } public static void merge(int[] arr, int l, int mid, int r) { int[] help = new int[r - l + 1]; int i = 0; int p1 = l; int p2 = mid + 1; while (p1 <= mid && p2 <= r) { help[i++] = arr[p1] < arr[p2] ? arr[p1++] : arr[p2++]; } while (p1 <= mid) { help[i++] = arr[p1++]; } while (p2 <= r) { help[i++] = arr[p2++]; } for (i = 0; i < help.length; i++) { arr[l + i] = help[i]; } } public static void main(String[] args) { int[] arr = { 9, 3, 1, 1, 8, 5, 5, 6, 0 }; mergeSort(arr, 0, arr.length - 1); for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); } } }

堆排序

/** * 堆排序:时间复杂度为O(n*logn) */ public class HeapSort { public static void heapSort(int[] arr) { if (arr == null || arr.length < 2) { return; } for (int i = 0; i < arr.length; i++) { heapInsert(arr, i); } int heapsize = arr.length; swap(arr, 0, --heapsize); while (heapsize > 0) { heapify(arr, 0, heapsize); swap(arr, 0, --heapsize); } } public static void heapify(int[] arr, int index, int heapsize) { int left = index * 2 + 1; while (left < heapsize) { int bigindex = left + 1 < heapsize && arr[left + 1] > arr[left] ? left + 1 : left; bigindex = arr[bigindex] > arr[index] ? bigindex : index; if (bigindex == index) { break; } swap(arr, bigindex, index); index = bigindex; left = index * 2 + 1; } } public static void heapInsert(int[] arr, int index) { while (arr[index] > arr[(index - 1) / 2]) { swap(arr, index, (index - 1) / 2); index = (index - 1) / 2; } } public static void swap(int[] arr, int i, int j) { int tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; } public static void main(String[] args) { int[] arr = { 2, 3, 6, 1, 8, 5, 5, 6, 0 }; heapSort(arr); for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); } } }

计数排序

public class CountSort { /** * 计数排序:时间复杂度为O(n*logn) */ public static void countSort(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(arr[i], max); } int[] bucket = new int[max + 1]; for (int i = 0; i < bucket.length; i++) { bucket[arr[i]]++; } int i = 0; for (int j = 0; j < bucket.length; j++) { while (bucket[j]-- > 0) { arr[i++] = j; } } } public static void main(String[] args) { int[] arr = { 2, 3, 6, 1, 8, 5, 5, 6, 0 }; countSort(arr); for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); } } }

​ 排序算法,就是如何使得记录按照要求排列的方法。排序算法在很多领域得到相当地重视,尤其是在大量数据的处理方面。一个优秀的算法可以节省大量的资源。在各个领域中考虑到数据的各种限制和规范,要得到一个符合实际的优秀算法,得经过大量的推理和分析。

最新回复(0)