冒泡排序(适合编程新手的体质)

冒泡排序:简单而高效的排序技巧

欢迎来到我们今天的博客,我们将一起探索计算机科学中最基本但同时也非常重要的概念之一:冒泡排序。无论你是编程新手还是有一些编程经验的读者,这篇博客都将帮助你更好地理解冒泡排序的原理和应用。

什么是冒泡排序?

冒泡排序是一种简单的排序算法,它重复地遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。这个过程就像气泡从水底升到水面一样,较大的元素会逐渐“浮”到数列的顶端。

冒泡排序的工作原理

让我们通过一个简单的例子来解释冒泡排序的工作原理:

假设我们有一个数列 [5, 1, 4, 2, 8],我们需要对其进行排序。

  1. 第一轮排序(外层循环的第1次):
    • 比较索引0和1的元素(5和1):5 > 1,交换。数组变为 [1, 5, 4, 2, 8]
    • 比较索引1和2的元素(5和4):5 > 4,交换。数组变为 [1, 4, 5, 2, 8]
    • 比较索引2和3的元素(5和2):5 > 2,交换。数组变为 [1, 4, 2, 5, 8]
    • 比较索引3和4的元素(5和8):5 < 8,不交换。
    • 第一轮结束后,最大的元素8“冒泡”到了正确的位置。
  2. 第二轮排序(外层循环的第2次):
    • 现在比较的范围缩小,最后一个元素(8)已经在正确位置,不再参与比较。
    • 比较索引0和1的元素(1和4),1 < 4,不交换。
    • 比较索引1和2的元素(4和2),4 > 2,交换。数组变为 [1, 2, 4, 5, 8]
    • 比较索引2和3的元素(4和5),4 < 5,不交换。
    • 第二轮结束后,第二大的元素5也到了正确的位置。
  3. 后续轮次
    • 每进行一轮排序,最大的元素都会被放置在它应在的位置,即数组的末尾。
    • 因此,每一轮后,参与比较的元素数量就减少一。
  4. 循环次数
    • 外层循环:负责进行多少轮比较。[5, 1, 4, 2, 8]这个数组,我们是不是一个个去进行比较,这是因为每一轮比较至少能确保一个元素移动到其最终位置,最后一个元素经过 n-1 轮后自然就处于正确的位置了。一次循环确保一个到最终位置,n-1次循环有n-1个,最后一个是不是就不需要比较了?因为他不得不被强制排序,相当于最后一次只比较两个,来看这个数组[5, 1, 4, 2, 8],第一次[1, 4, 2, 5, 8],第二次[1, 2, 4, 5, 8],第三次[1, 2, 4, 5, 8],由于2,4不需要比较,第四个[1, 2, 4, 5, 8]是不是可以看到最后一次比较可以把第一个第二个的数字都排好序,相当于一次排序解决了两个数字,而别的都是一次解决一个,所以外层只有n-1次循环
    • 内层循环:我们可以想一下,数字之间两两比较,我下面用数字来说明第几和第几比较:1与2,2与3,3与4,4与5,在这个例子中,有5个元素,需要进行4轮比较(因为最后一轮只剩一个元素,自然是有序的)。你可以发现因为是两两比较每个元素都会轮到,但是最后一个元素轮不到,所以次数是n-1,哎注意看,重点来了,我们会发现内层的循环次数与外层挂钩对不对,外层决定了从第几个开始,第一轮就是第一个开始,第二轮就是第二个开始,那么我们是不是要在n-1的基础上减去第几轮呢?,没错到这里你就理解了。

冒泡排序的时间复杂度

  • 时间复杂度:冒泡排序的平均和最坏时间复杂度都是 O(n^2),其中 n 是数列的长度。这意味着如果数列的长度加倍,排序所需的时间会增加四倍。
  • 空间复杂度:冒泡排序的空间复杂度是 O(1),因为它只需要一个额外的空间来交换元素。

适用场景与限制

尽管冒泡排序非常简单易懂,但它并不适合大规模的数据排序,因为其效率较低。然而,对于小规模数据或者教学目的,冒泡排序是一个非常好的选择。

结语

冒泡排序以其简单易学而广受欢迎,它不仅帮助我们理解排序的基本原理,还为我们学习更复杂的排序算法奠定了基础。希望这篇博客帮助你更好地理解了冒泡排序的魅力!

附上代码实现

使用了三个主流的语言进行实现

#include 

void bubbleSort(int arr[], int n) {
    int i, j, temp;
    for (i = 0; i < n-1; i++)    
        for (j = 0; j < n-i-1; j++) 
            if (arr[j] > arr[j+1]) {
                temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }
}

int main() {
    int arr[] = {5, 1, 4, 2, 8};
    int n = sizeof(arr)/sizeof(arr[0]);
    bubbleSort(arr, n);
    printf("Sorted array: \n");
    for (int i = 0; i < n; i++)
        printf("%d ", arr[i]);
    return 0;
}

def bubbleSort(arr):
    n = len(arr)
    for i in range(n):
        for j in range(0, n-i-1):
            if arr[j] > arr[j+1]:
                arr[j], arr[j+1] = arr[j+1], arr[j]

arr = [5, 1, 4, 2, 8]
bubbleSort(arr)
print("Sorted array is:", arr)

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

    public static void main(String args[]) {
        BubbleSort ob = new BubbleSort();
        int arr[] = {5, 1, 4, 2, 8};
        ob.bubbleSort(arr);
        System.out.println("Sorted array");
        for (int i=0; i<arr.length; ++i)
            System.out.print(arr[i] + " ");
    }
}

你可能感兴趣的:(数据结构,算法,排序算法,数据结构)