数据结构之八大排序算法详解
- 人工智能
- 2025-09-20 16:42:01

目录 一、冒泡排序(Bubble Sort)原理代码实现时间复杂度 二、选择排序(Selection Sort)原理代码实现时间复杂度 三、插入排序(Insertion Sort)原理代码实现时间复杂度 四、希尔排序(Shell Sort)原理代码实现时间复杂度 五、归并排序(Merge Sort)原理代码实现时间复杂度 六、快速排序(Quick Sort)原理代码实现时间复杂度 七、堆排序(Heap Sort)原理代码实现时间复杂度 八、计数排序(Counting Sort)原理代码实现时间复杂度 总结 排序算法是计算机科学中一类重要的算法,用于将数据按照特定的顺序进行排列。以下是对八大排序算法的详细讲解,包括冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序和计数排序。 一、冒泡排序(Bubble Sort) 原理
冒泡排序是一种简单的排序算法,通过重复地遍历数组,比较相邻的元素并交换顺序,直到整个数组排序完成。
代码实现 public class BubbleSort { public static void bubbleSort(int[] arr) { int n = arr.length; for (int i = 0; i < n - 1; i++) { for (int j = 0; j < n - i - 1; j++) { if (arr[j] > arr[j + 1]) { // 交换 arr[j] 和 arr[j+1] int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } } public static void main(String[] args) { int[] arr = {64, 34, 25, 12, 22, 11, 90}; bubbleSort(arr); System.out.println("Sorted array: " + Arrays.toString(arr)); } } 时间复杂度 平均时间复杂度:O(n²)最优时间复杂度:O(n)(当数组已经排序时)最差时间复杂度:O(n²) 二、选择排序(Selection Sort) 原理选择排序通过重复选择最小的元素并将其交换到数组的起始位置,直到整个数组排序完成。
代码实现 public class SelectionSort { public static void selectionSort(int[] arr) { int n = arr.length; for (int i = 0; i < n - 1; i++) { int minIndex = i; for (int j = i + 1; j < n; j++) { if (arr[j] < arr[minIndex]) { minIndex = j; } } // 交换 arr[i] 和 arr[minIndex] int temp = arr[i]; arr[i] = arr[minIndex]; arr[minIndex] = temp; } } public static void main(String[] args) { int[] arr = {64, 34, 25, 12, 22, 11, 90}; selectionSort(arr); System.out.println("Sorted array: " + Arrays.toString(arr)); } } 时间复杂度 平均时间复杂度:O(n²)最优时间复杂度:O(n²)最差时间复杂度:O(n²) 三、插入排序(Insertion Sort) 原理插入排序将数组分为已排序和未排序两个部分,每次从未排序部分取出一个元素,插入到已排序部分的正确位置。
代码实现 public class InsertionSort { public static void insertionSort(int[] arr) { int n = arr.length; for (int i = 1; i < n; ++i) { int key = arr[i]; int j = i - 1; while (j >= 0 && arr[j] > key) { arr[j + 1] = arr[j]; j = j - 1; } arr[j + 1] = key; } } public static void main(String[] args) { int[] arr = {64, 34, 25, 12, 22, 11, 90}; insertionSort(arr); System.out.println("Sorted array: " + Arrays.toString(arr)); } } 时间复杂度 平均时间复杂度:O(n²)最优时间复杂度:O(n)(当数组已经排序时)最差时间复杂度:O(n²) 四、希尔排序(Shell Sort) 原理希尔排序是一种改进的插入排序,通过将数组分成多个子数组,对每个子数组进行插入排序,然后逐渐缩小子数组的间隔。
代码实现 public class ShellSort { public static void shellSort(int[] arr) { int n = arr.length; for (int gap = n / 2; gap > 0; gap /= 2) { for (int i = gap; i < n; i += 1) { int temp = arr[i]; int j; for (j = i; j >= gap && arr[j - gap] > temp; j -= gap) { arr[j] = arr[j - gap]; } arr[j] = temp; } } } public static void main(String[] args) { int[] arr = {64, 34, 25, 12, 22, 11, 90}; shellSort(arr); System.out.println("Sorted array: " + Arrays.toString(arr)); } } 时间复杂度 平均时间复杂度:O(n^(3/2))最优时间复杂度:O(n)最差时间复杂度:O(n²) 五、归并排序(Merge Sort) 原理归并排序是一种分治算法,将数组分为两部分,分别排序,然后将排序后的两部分合并。
代码实现 public class MergeSort { public static void mergeSort(int[] arr) { if (arr == null || arr.length <= 1) { return; } mergeSort(arr, 0, arr.length - 1); } private static void mergeSort(int[] arr, int left, int right) { if (left < right) { int mid = (left + right) / 2; 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[] temp = new int[right - left + 1]; int i = left, j = mid + 1, k = 0; while (i <= mid && j <= right) { if (arr[i] <= arr[j]) { temp[k++] = arr[i++]; } else { temp[k++] = arr[j++]; } } while (i <= mid) { temp[k++] = arr[i++]; } while (j <= right) { temp[k++] = arr[j++]; } System.arraycopy(temp, 0, arr, left, temp.length); } public static void main(String[] args) { int[] arr = {64, 34, 25, 12, 22, 11, 90}; mergeSort(arr); System.out.println("Sorted array: " + Arrays.toString(arr)); } } 时间复杂度 平均时间复杂度:O(n log n)最优时间复杂度:O(n log n)最差时间复杂度:O(n log n) 六、快速排序(Quick Sort) 原理快速排序也是一种分治算法,通过选择一个基准元素,将数组分为小于基准和大于基准的两部分,然后递归地对两部分进行排序。
代码实现 public class QuickSort { public static void quickSort(int[] arr) { if (arr == null || arr.length <= 1) { return; } quickSort(arr, 0, arr.length - 1); } private static void quickSort(int[] arr, int left, int right) { if (left >= right) { return; } int pivotIndex = partition(arr, left, right); quickSort(arr, left, pivotIndex - 1); quickSort(arr, pivotIndex + 1, right); } private static int partition(int[] arr, int left, int right) { int pivot = arr[right]; int i = left - 1; for (int j = left; j < right; j++) { if (arr[j] <= pivot) { i++; swap(arr, i, j); } } swap(arr, i + 1, right); return i + 1; } private static void swap(int[] arr, int i, int j) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } public static void main(String[] args) { int[] arr = {64, 34, 25, 12, 22, 11, 90}; quickSort(arr); System.out.println("Sorted array: " + Arrays.toString(arr)); } } 时间复杂度 平均时间复杂度:O(n log n)最优时间复杂度:O(n log n)最差时间复杂度:O(n²) 七、堆排序(Heap Sort) 原理堆排序是一种基于堆数据结构的排序算法。首先将数组构建成一个最大堆,然后通过交换堆顶元素与数组末尾元素,并重新调整堆,以实现排序。
代码实现 public class HeapSort { public static void heapSort(int[] arr) { int n = arr.length; // 构建最大堆 for (int i = n / 2 - 1; i >= 0; i--) { heapify(arr, n, i); } // 提取元素并重新构建堆 for (int i = n - 1; i > 0; i--) { swap(arr, 0, i); heapify(arr, i, 0); } } private static void heapify(int[] arr, int n, int i) { int largest = i; int left = 2 * i + 1; int right = 2 * i + 2; if (left < n && arr[left] > arr[largest]) { largest = left; } if (right < n && arr[right] > arr[largest]) { largest = right; } if (largest != i) { swap(arr, i, largest); heapify(arr, n, largest); } } private static void swap(int[] arr, int i, int j) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } public static void main(String[] args) { int[] arr = {64, 34, 25, 12, 22, 11, 90}; heapSort(arr); System.out.println("Sorted array: " + Arrays.toString(arr)); } } 时间复杂度 平均时间复杂度:O(n log n)最优时间复杂度:O(n log n)最差时间复杂度:O(n log n) 八、计数排序(Counting Sort) 原理计数排序是一种非比较排序算法,适用于整数排序。通过统计元素出现的次数,然后根据累计的次数将元素放置到正确的位置。
代码实现 public class CountingSort { public static void countingSort(int[] arr) { if (arr == null || arr.length == 0) { return; } int max = arr[0]; int min = arr[0]; for (int num : arr) { if (num > max) { max = num; } if (num < min) { min = num; } } int range = max - min + 1; int[] count = new int[range]; int[] output = new int[arr.length]; for (int num : arr) { count[num - min]++; } for (int i = 1; i < range; i++) { count[i] += count[i - 1]; } for (int i = arr.length - 1; i >= 0; i--) { output[count[arr[i] - min] - 1] = arr[i]; count[arr[i] - min]--; } System.arraycopy(output, 0, arr, 0, arr.length); } public static void main(String[] args) { int[] arr = {64, 34, 25, 12, 22, 11, 90}; countingSort(arr); System.out.println("Sorted array: " + Arrays.toString(arr)); } } 时间复杂度 平均时间复杂度:O(n + k)(其中 k 是元素的范围)最优时间复杂度:O(n + k)最差时间复杂度:O(n + k) 总结这八大排序算法各有优缺点,适用于不同的场景。在实际应用中,应根据数据的规模和特点选择合适的排序算法。
数据结构之八大排序算法详解由讯客互联人工智能栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“数据结构之八大排序算法详解”