冒泡排序简述

冒泡排序(C&Java实现)

2019/8/14 10:41:46

使用工具:

   Java:IDEA  
      C:CLion
文档编写:MarkdownPad2

每天一算法,希望自己的算法能有长足的进步,加油。

近几天线上的笔试更让我感受到各大互联网公司对于算法的重视。的确,现下主流的框架已经十分成熟,正常学习了就能知道如何使用,但是想要更进一步融合成自己的东西,融会贯通,还是需要深入其中去钻研,算法也算程序员的分水岭了,加油。


接下来看看今天的算法:冒泡排序

冒泡排序

冒泡排序(Bubble Sort),是一种较简单的 排序算法

基本思想:每次比较两个相邻的元素,如果他们的顺序错误就把它们交换过来。

原理:
   1. 比较相邻的元素,如果第一个比第二个大(小),就交换他们两个。
   2. 对每一对相邻元素做同样的工作,从开始第一对到结尾最后一对。
   3. 每一趟只能确定将一个数归位,针对所有元素重复以上步骤。

总结:如果有 n 个数进行排序,只需将 n-1 个数归位,也就是说要进行 n-1 趟操作。

算法分析

冒泡排序的算法核心部分是双重嵌套循环。

平均时间复杂度为:O(n^2)。

冒泡排序是一种稳定的排序算法。

代码实现

  1、C语言实现

//
// Created by czc on 2019/8/14.
//

#include<stdio.h>


int main(){

int book[100],i,j,t,n;
printf("请输入输入数据个数:");

scanf("%d",&n);

//循环读入n个数到数组中
for(i=1;i<=n;i++){
    scanf("%d",&book[i]);
}

//冒泡排序核心部分:双重循环
for(i=1;i<=n-1;i++){
    for(j=1;j<=n-i;j++){
        if(book[j]>book[j+1]){
            t=book[j];
            book[j]=book[j+1];
            book[j+1]=t;
        }
    }
}

for(i=1;i<=n;i++){
    printf("%d",book[i]);
    printf(" ");
}

return 0;
}

程序测试结果:

1370213-20190814113411917-975572178.png

  2、Java实现

/*
创建人:czc
创建时间:2019/8/14
用途:冒泡排序
 */

import java.util.Scanner;

import static java.lang.System.out;
public class BubbleSort {
  private static Scanner scanner;

  public static void main(String[] args){
    int[] book=new int[100];

    int i,j,t,n;
    scanner=new Scanner(System.in);
    out.println("请输入排序数据个数:");
    n=scanner.nextInt();

    for(i=1;i<=n;i++){
        book[i]=scanner.nextInt();
    }

    //冒泡排序核心部分
    for(i=1;i<=n-1;i++){
        for(j=1;j<=n-i;j++){
            if(book[j]>book[j+1]){
                t=book[j];
                book[j]=book[j+1];
                book[j+1]=t;
            }
        }
    }

    for(i=1;i<=n;i++){
        out.print(book[i]+" ");
    }

  }

}

程序测试截图:

1370213-20190814113423880-240196554.png

吾生也有涯,而知也无涯。

转载于:https://www.cnblogs.com/hzauxx/p/11350957.html

<think>好的,我现在需要回答用户关于冒泡排序算法的工作原理及步骤的问题。用户之前已经提供了两个关于冒泡排序的引用,但主要是关于原理和优化的,我需要先理清冒泡排序的基本流程。 首先,冒泡排序的基本思想是通过重复遍历待排序的列表,比较相邻元素的大小,如果顺序错误就交换它们。这样每一轮遍历会将最大的元素“冒泡”到末尾。这个过程类似于气泡从水底升到水面,因此得名。 接下来,我需要分步骤解释这个过程。比如,第一轮遍历后,最大的元素会排在最后;第二轮则处理剩下的元素,次大的元素会排在倒数第二位,依此类推。需要说明每次遍历的范围逐渐缩小,因为末尾的元素已经排好序了。 然后,关于实现部分,用户可能需要一个示例代码。虽然用户之前提供的引用是关于C++的,但用户给出的示例是Python的快速排序,所以或许用Python实现更合适。我需要确保代码正确,使用嵌套循环,外层循环控制遍历次数,内层循环进行相邻比较和交换。 还要注意时间复杂度的分析,最好提到最好情况、平均情况和最坏情况下的时间复杂度,都是$O(n^2)$,但优化后最好情况可以降到$O(n)$。引用中的优化方法,比如提前终止,可以在实现部分加入一个标志位来检测某一轮是否已经有序,从而提前结束排序。 最后,根据用户的要求,生成相关问题。可能需要包括优化方法、复杂度分析、与其他排序算法的比较等。确保问题相关且有深度,帮助用户进一步学习。 现在需要检查LaTeX格式是否正确,比如变量和公式是否正确使用$...$,独立公式是否用$$...$$。例如,时间复杂度应该用行内公式,而如果有独立公式可能需要单独成段,但冒泡排序可能不需要复杂的数学公式,所以可能主要用行内即可。 还要注意引用标识,比如在提到优化方法时,末尾添加引用标识[^1][^2],但用户提供的引用是站内的,可能需要适当关联。不过用户说明引用仅供参考,所以可能不需要过多依赖,重点还是回答用户的问题。 最后确保回答结构清晰,分点说明原理、步骤、实现和优化,代码用正确的格式,并生成相关问题。</think>### 冒泡排序算法的工作原理及步骤 #### 一、基本原理 冒泡排序是一种**基于相邻元素比较和交换**的排序算法。其核心思想是通过重复遍历列表,每次比较相邻的两个元素,若顺序错误则交换它们,使得较大(或较小)的元素逐渐“浮”到列表末端[^1]。 #### 二、具体步骤 1. **遍历列表**:从列表第一个元素开始,依次比较相邻元素的值。 2. **比较与交换**:若当前元素大于其后一个元素(以升序排序为例),则交换两者的位置。 3. **缩小遍历范围**:每一轮遍历后,列表末尾的最后一个元素已为当前最大值,因此下一轮遍历时无需再比较已排序的部分。 4. **重复过程**:持续上述操作,直到所有元素有序(即某一轮遍历中未发生任何交换)。 #### 三、时间复杂度分析 - **最坏情况**(完全逆序):$O(n^2)$ - **平均情况**:$O(n^2)$ - **最好情况**(已有序):未优化时为$O(n^2)$,优化后可降至$O(n)$[^2]。 #### 四、基础实现(Python示例) ```python def bubble_sort(arr): n = len(arr) for i in range(n): # 标记本轮是否发生交换 swapped = False for j in range(0, n-i-1): if arr[j] > arr[j+1]: arr[j], arr[j+1] = arr[j+1], arr[j] swapped = True # 若未交换,说明已有序,提前终止 if not swapped: break return arr ``` #### 五、优化方法 1. **提前终止**:通过`swapped`标志检测是否已有序,减少无效遍历[^1]。 2. **记录最后交换位置**:进一步缩小下一轮遍历的边界。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值