冒泡排序的详细介绍 , 以及c , python , Java的实现方法

冒泡排序(Bubble Sort)是一种简单的排序算法,它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。

冒泡排序的原理

  1. 比较与交换
    • 冒泡排序从数列的第一个元素开始,比较相邻的两个元素。
    • 如果他们的顺序(如从小到大)错误,就交换他们的位置。
    • 这样,较大的元素就像气泡一样"浮"到数列的末端。
  2. 多轮遍历
    • 经过第一轮遍历后,最大的元素会被"冒泡"到数列的最后一位。
    • 接下来,算法会忽略已经排序好的最后一个元素,继续对剩下的元素进行同样的操作。
    • 每一轮遍历后,都会有一个元素被放到它最终的位置上。
  3. 终止条件
    • 当算法发现没有元素需要交换时(即没有发生任何冒泡),说明数列已经排序完成,此时可以终止算法。

示例

假设有一个数列 {64, 34, 25, 12, 22, 11, 90},我们想要按照从小到大的顺序排序它。

第一轮遍历:

  • 比较 64 和 34,交换它们(34, 64)。
  • 比较 34 和 25,交换它们(25, 34, 64)。
  • 比较 25 和 12,交换它们(12, 25, 34, 64)。
  • ...(继续比较和交换)
  • 第一轮结束后,最大的元素 90 被移动到了最后一位。

第二轮遍历(忽略已经排序好的 90):

  • 经过类似的比较和交换后,次大的元素 64 会被移动到倒数第二位。

以此类推,经过多轮遍历后,数列会被排序完成。

效率

冒泡排序的效率并不高,特别是对于大数据集来说。它的时间复杂度为 O(n^2),其中 n 是待排序数列的长度。但是,由于其实现简单且易于理解,它通常被用作教学示例。在实际应用中,更高效的排序算法(如快速排序、归并排序、堆排序等)通常会被优先考虑。

Java实现冒泡排序法

java 复制代码
import java.util.Scanner;

public class Demo1 {
    public static void main(String[] args) {
        // 使用冒泡法进行排序
        int[] arr = new int[5];
        int number;
        int i;
        Scanner sc = new Scanner(System.in);

        for(i = 0 ; i < arr.length ; i++){
            arr[i] = sc.nextInt();
        }

        for(i = 0 ; i < arr.length -1  ; i++){
            // 冒泡法
            for(int j = 0 ; j < arr.length - 1 -i  ; j++){
                if (arr[j] > arr[j+1]){
                    number = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = number;
                }
            }

        }
        for(i = 0 ; i < arr.length  ; i++){
            System.out.println(arr[i]);
        }
    }
}

c语言实现

cs 复制代码
#include <stdio.h>  
  
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[100], n, i;  
  
    printf("Enter the number of elements: ");  
    scanf("%d", &n);  
  
    printf("Enter %d elements: ", n);  
    for (i = 0; i < n; i++) {  
        scanf("%d", &arr[i]);  
    }  
  
    bubbleSort(arr, n);  
  
    printf("Sorted array: \n");  
    for (i = 0; i < n; i++) {  
        printf("%d ", arr[i]);  
    }  
    printf("\n");  
  
    return 0;  
}

python实现

python 复制代码
def bubble_sort(arr):  
    n = len(arr)  
    for i in range(n):  
        # 创建一个标志位,用于判断本轮是否有交换  
        swapped = False  
        for j in range(0, n - i - 1):  
            # 遍历到倒数第i+1个元素即可,因为最后i个元素已经有序  
            if arr[j] > arr[j + 1]:  
                # 如果前一个元素大于后一个元素,则交换它们  
                arr[j], arr[j + 1] = arr[j + 1], arr[j]  
                # 交换发生,标志位设为True  
                swapped = True  
        # 如果本轮没有发生交换,说明数组已经有序,可以提前结束排序  
        if not swapped:  
            break  
    return arr  
  
# 测试代码  
arr = [64, 34, 25, 12, 22, 11, 90]  
sorted_arr = bubble_sort(arr)  
print("Sorted array:", sorted_arr)
相关推荐
Mephisto.java23 分钟前
【力扣 | SQL题 | 每日四题】力扣2082, 2084, 2072, 2112, 180
sql·算法·leetcode
robin_suli24 分钟前
滑动窗口->dd爱框框
算法
丶Darling.26 分钟前
LeetCode Hot100 | Day1 | 二叉树:二叉树的直径
数据结构·c++·学习·算法·leetcode·二叉树
labuladuo52036 分钟前
Codeforces Round 977 (Div. 2) C2 Adjust The Presentation (Hard Version)(思维,set)
数据结构·c++·算法
Indigo_code1 小时前
【数据结构】【链表代码】合并有序链表
数据结构·windows·链表
jiyisuifeng19911 小时前
代码随想录训练营第54天|单调栈+双指针
数据结构·算法
我言秋日胜春朝★1 小时前
【C++】红黑树
数据结构
꧁༺❀氯ྀൢ躅ྀൢ❀༻꧂1 小时前
实验4 循环结构
c语言·算法·基础题
新晓·故知1 小时前
<基于递归实现线索二叉树的构造及遍历算法探讨>
数据结构·经验分享·笔记·算法·链表
总裁余(余登武)2 小时前
算法竞赛(Python)-万变中的不变“随机算法”
开发语言·python·算法