排序算法

排序算法

常见的排序算法

排序算法 时间复杂度(平均) 时间复杂度(最好) 时间复杂度(最坏) 空间复杂度 稳定性
冒泡排序(Bubble Sort) O(n^2) O(n) O(n^2) O(1) 稳定
选择排序(Selection Sort) O(n^2) O(n^2) O(n^2) O(1) 不稳定
插入排序(Insertion Sort) O(n^2) O(n) O(n^2) O(1) 稳定
希尔排序(Shell Sort) O(n log n) O(n) O(n^2) O(1) 不稳定
归并排序(Merge Sort) O(n log n) O(n log n) O(n log n) O(n) 稳定
快速排序(Quick Sort) O(n log n) O(n log n) O(n^2) O(n log n) 不稳定
堆排序(Heap Sort) O(n log n) O(n log n) O(n log n) O(1) 不稳定
计数排序(Counting Sort) O(n+k) O(n+k) O(n+k) O(k) 稳定
桶排序(Bucket Sort) O(n^2) O(n) O(n^2) O(n+k) 稳定
基数排序(Radix Sort) O(n*k) O(n*k) O(n*k) O(n+k) 稳定

其中,n表示输入元素的数量,k表示元素的取值范围大小。

稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面。
不稳定:如果a原本在b的前面,而a=b,排序之后 a 可能会出现在 b 的后面。
时间复杂度:对排序数据的总的操作次数。反映当n变化时,操作次数呈现什么规律。
空间复杂度:是指算法在计算机 内执行时所需存储空间的度量,它也是数据规模n的函数。

1.冒泡排序(Bubble Sort)

冒泡排序是一种简单的排序算法,它重复地遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就交换位置。这个过程持续对数列的末尾进行,直到整个数列都排序完成。

import org.junit.jupiter.api.Assertions;
import java.util.Arrays;

public class Bubble {
    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+1]和arr[j]
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
        }
    }

public static void main(String[] args) {
    int[] arr = {5, 2, 8, 3, 1, 6};
    int[] expectedArr = {1, 2, 3, 5, 6, 8};
    Bubble.bubbleSort(arr);
    System.out.println("arr = " + Arrays.toString(arr));
    Assertions.assertArrayEquals(expectedArr, arr);
}

}


在上面的代码中, bubbleSort 函数接受一个整数数组作为输入,并使用冒泡排序算法对其进行排序。外部循环运行 n - 1 次,其中 n 是数组的长度,内部循环运行 n - i - 1 次,其中 i 是外部循环的当前迭代次数。这是因为在每次外部循环迭代后,最大的元素肯定在数组的末尾,因此我们不需要再次比较它。

在内部循环中,我们比较相邻的元素并交换它们,如果它们的顺序不正确。这样,最大的元素就“冒泡”到数组的末尾。在每次遍历数组后,最大的元素都处于它的最终位置,因此我们可以将内部循环的大小减少1。

posted @ 2024-08-01 21:41  商鞅-210162701023  阅读(16)  评论(1)    收藏  举报