前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >冒泡排序

冒泡排序

作者头像
用户1154259
发布于 2018-01-17 11:13:48
发布于 2018-01-17 11:13:48
60600
代码可运行
举报
运行总次数:0
代码可运行

冒泡排序时间复杂度上为O(n^2)

冒泡排序三种方式,第一种也是最基本的排序:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void bubbleSort1(int *arr,int length){
    int i,j,k;
    for(i=0;i<length;i++){
        for(j=i+1;j<length;j++){
            if(arr[i]>arr[j]){
                k = arr[j];
                arr[j] = arr[i];
                arr[i] = k;
            }
        }
    }
}

第二种是循环的时候,j指针从尾部开始,每次可以顺便排序其他的元素

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void bubbleSort2(int *arr,int length){
    int i,j,k;
    for(i=0;i<length;i++){
        for(j=length-1;j>=i;j--){
            if(arr[j] < arr[j-1]){
                k = arr[j-1];
                arr[j-1] = arr[j];
                arr[j] = k;
            }
        }
    }
}

第三种是加入一个标记为,如果一次遍历发现没有元素冒泡,那么立刻停止

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void bubbleSort3(int *arr,int length){
    int i,j,k;
    bool flag = true;
    for(i=0;i<length && flag; i++){
        flag = false;
        for(j=i+1;j<length;j++){
            if(arr[i] > arr[j]){
                k = arr[j];
                arr[j] = arr[i];
                arr[i] = k;
                flag = true;
            }
        }
    }
}

测试后发现,除了正序的极端情况下,第三种的冒泡排序快一些,其他情况下的冒泡排序都是原始的最简单的方法快。

乱序情况下:

正序情况下

逆序情况下:

全部代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <time.h>
  4 void copy(int *arr,int length);
  5 void bubbleSort1(int *arr,int length);
  6 void bubbleSort2(int *arr,int length);
  7 void bubbleSort3(int *arr,int length);
  8 void print(int *arr,int length);
  9 //int arrtest[10] = {3,4,7,8,0,9,1,2,6,5};
 10 //int arrtest[10] = {0,1,2,3,4,5,6,7,8,9};
 11 int arrtest[10] = {9,8,7,6,5,4,3,2,1,0};
 12 int main(){
 13     int i;
 14     clock_t start,end;
 15     int Array[10];
 16     copy(Array,10);
 17     print(Array,10);
 18     printf("bubble 1:\n");
 19     start = clock();
 20     for(i=0;i<100000;i++){
 21         copy(Array,10);
 22         //print(Array,10);
 23         bubbleSort1(Array,10);
 24     }
 25     end = clock();
 26     print(Array,10);
 27     printf("bubble 1 time: %d \n\n",end-start);
 28 
 29     printf("bubble 2:\n");
 30     start = clock();
 31     for(i=0;i<100000;i++){
 32         copy(Array,10);
 33         //print(Array,10);
 34         bubbleSort2(Array,10);
 35     }
 36     end = clock();
 37     print(Array,10);
 38     printf("bubble 2 time: %d \n\n",end-start);
 39     
 40     printf("bubble 3:\n");
 41     start = clock();
 42     for(i=0;i<100000;i++){
 43         copy(Array,10);
 44         //print(Array,10);
 45         bubbleSort3(Array,10);
 46     }
 47     end = clock();
 48     print(Array,10);
 49     printf("bubble 3 time: %d \n\n",end-start);
 50     
 51     getchar();
 52     return 0;
 53 }
 54 void copy(int *arr,int length){
 55     int i;
 56     for(i=0;i<length;i++){
 57         arr[i] = arrtest[i];
 58     }
 59 }
 60 void bubbleSort1(int *arr,int length){
 61     int i,j,k;
 62     for(i=0;i<length;i++){
 63         for(j=i+1;j<length;j++){
 64             if(arr[i]>arr[j]){
 65                 k = arr[j];
 66                 arr[j] = arr[i];
 67                 arr[i] = k;
 68             }
 69         }
 70     }
 71 }
 72 void bubbleSort2(int *arr,int length){
 73     int i,j,k;
 74     for(i=0;i<length;i++){
 75         for(j=length-1;j>=i;j--){
 76             if(arr[j] < arr[j-1]){
 77                 k = arr[j-1];
 78                 arr[j-1] = arr[j];
 79                 arr[j] = k;
 80             }
 81         }
 82     }
 83 }
 84 void bubbleSort3(int *arr,int length){
 85     int i,j,k;
 86     bool flag = true;
 87     for(i=0;i<length && flag; i++){
 88         flag = false;
 89         for(j=i+1;j<length;j++){
 90             if(arr[i] > arr[j]){
 91                 k = arr[j];
 92                 arr[j] = arr[i];
 93                 arr[i] = k;
 94                 flag = true;
 95             }
 96         }
 97     }
 98 }
 99 void print(int *arr,int length){
100     int i;
101     for(i=0;i<length;i++){
102         printf("%d ",arr[i]);
103     }
104     printf("\n");
105 }

最终可以看到:

冒泡排序方法1>2>3

而从时间运行角度来说:正序情况下最快,乱序排中,逆序情况下最慢

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2014-04-09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
[排序算法]–冒泡排序的三种实现(Java)
设数组的长度为N: (1)比较前后相邻的二个数据,如果前面数据大于后面的数据,就将这二个数据交换。
全栈程序员站长
2022/06/25
1930
排序算法之从冒泡排序所想到的
1)将相邻的两个数进行比較,假设前面的一个大于后面的一个,则将他们交换。每次循环能使一个数达到有序状态。
全栈程序员站长
2022/07/13
2470
js的简单排序算法
冒泡排序平均时间复杂度是O(n*n),最好的情况是O(n)、最差的情况是O(n*n) 空间复杂度是O(1) 特点:外层for循环控制循环次数、内层for循环进行两数交换,找出最大的数放到最后 改进: 1)处理在排序过程中数组整体已经有序的情况,设置标志位 2)数组局部有序,遍历过程中记录最后一次交换的位置,设置为下一次交换的终点 3)同时将最大最小值归位,双向冒泡排序
epoos
2022/06/06
1.1K0
看动画学算法之:排序-冒泡排序
排序可能是所有的算法中最最基础和最最常用的了。排序是一个非常经典的问题,它以一定的顺序对一个数组(或一个列表)中的项进行重新排序。
程序那些事
2020/07/14
5130
看动画学算法之:排序-冒泡排序
冒泡排序深入具体解释
冒泡排序(Bubble Sort)是一种交换排序,它的基本思想是:两两比較相邻记录的keyword,假设凡需则交换。直到没有凡需的记录位置。
全栈程序员站长
2022/07/08
2610
冒泡排序深入具体解释
排序算法:冒泡排序
2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
谙忆
2021/01/21
4750
漫画:冒泡排序最牛逼的状态!
除了刚刚小k写的算法,我们还可以做进一步的优化。如果有100个数的数组,仅前面10个无序,后面90个都已排好序且都大于前面10个数字,那么在第一趟遍历后,最后发生交换的位置必定小于10,且这个位置之后的数据必定已经有序了,记录下这位置,第二次只要从数组头部遍历到这个位置就可以了。
Python进击者
2020/02/24
4770
Swift 冒泡排序及优化
时间复杂度 冒泡排序的最佳时间复杂度为O(n),即初始状态就是排好序的。 冒泡排序的最坏时间复杂复杂度为O(n2),即初始状态就是逆序的。 冒泡排序的平均时间复杂复杂度为O(n2)
韦弦zhy
2018/09/11
1.2K0
Swift 冒泡排序及优化
经典算法——冒泡排序
任何被明确定义的计算过程都可以称作 算法 ,它将某个值或一组值作为输入,并产生某个值或一组值作为输出。所以 算法可以被称作将输入转为输出的一系列的计算步骤 。
鱼找水需要时间
2023/02/16
5690
经典算法——冒泡排序
[数据结构与算法] 排序算法之冒泡排序与快速排序(快排)
冒泡排序法 冒泡排序(Bubble Sorting)的基本思想是: 通过对待排序序列从前向后(从下标较小的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就象水
时间静止不是简史
2020/07/25
4010
(2)交换排序之冒泡排序
title: (2)交换排序之冒泡排序 date: 2019-02-10 13:00:00 +0800 update: 2019-02-10 13:00:00 +0800 author: me cover: http://ww1.sinaimg.cn/large/006jIRTegy1fzwiafdswej31jk0v9qp2.jpg preview: 冒泡排序是非常好理解的,以从小到大排序为例,每一轮排序就找出未排序序列中最大值放在最后。 tags:
suveng
2019/09/17
5170
(2)交换排序之冒泡排序
《数据结构与算法之美》——冒泡排序、插入排序、选择排序
当然,撇开这些业务场景,排序算法本身有一些自己的衡量指标,比如我们经常提到的复杂度分析。
JackieZheng
2019/05/25
4530
算法一看就懂之「 冒泡排序 」
上一篇文章「 排序算法 」已经整体的把排序算法的分类和评估方法介绍了一下,今天起咱们就开始依次介绍一下各种排序算法的原理和特性。咱们就从最容易理解的「 冒泡排序 」开始吧。
奎哥
2019/09/25
4070
算法一看就懂之「 冒泡排序 」
希尔排序
希尔排序的时间复杂度,最好的情况下仍然是正序时,可达到O(n),平均复杂度为O(nlogn)。 算法思想: 采用跳跃式处理数组,使得数组粗粒度的实现基本有序。在进行细粒度的处理,最终使得网络在跳越数为1时,实现基本有序的排序,以减少插入排序的复杂度。 主要程序: void shellSort(int *arr,int length){ int i,j,k; int increment = length; while(increment>0){ if(incremen
用户1154259
2018/01/17
4410
希尔排序
直接插入排序
时间复杂度: 如果排序的数组是正序的,那么时间复杂度相当于O(n), 而如果排序是随机的,时间复杂度相当于O(n^2/4). 倒置的时间复杂度是最高的,O(n^2). 算法思想:   该算法是设置了一个中间存储,每次读到的数据存储到中间值。向前遍历,如果大于这个值,继续向前,每次向前遍历时,把数据向后移,最后空出的位置,就是他本身应该在的位置。因此,如果是一个正序的数组,就不会出现移动的情况,时间复杂度也就降低了。 主要代码: void straightInsert(int *arr,int length)
用户1154259
2018/01/17
5090
直接插入排序
指针详解(冒泡排序、qsort、回调函数、转移表)(三)
冒泡排序的核心思想就是:两两相邻的元素进行比较先写一个基本框架再实现函数定义部分 ,先外层循环确定趟数,再内层循环确定每趟交换的对数,最后判断相邻元素大小,如果不满足顺序就交换
走在努力路上的自己
2024/01/26
1700
指针详解(冒泡排序、qsort、回调函数、转移表)(三)
冒泡排序优化
这个版本,有一个问题:前三个元素,本来就是有序的,但是他们还是走了第7,8,9这三轮。所以,我们可以进行一下优化,如果这一轮没有元素进行交换了,那就停止;我们使用一个标志位,来记录一下:
IT云清
2019/01/22
5550
python排序算法
排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。排序算法,就是如何使得记录按照要求排列的方法。
python与大数据分析
2022/03/11
4730
python排序算法
java冒泡排序代码_Java冒泡排序
依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。至此第一趟结束,将最大的数放到了最后。在第二趟:仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),将小数放前,大数放后,一直比较到倒数第二个数(倒数第一的位置上已经是最大的),第二趟结束,在倒数第二的位置上得到一个新的最大数(其实在整个数列中是第二大的数)。如此下去,重复以上过程,直至最终完成排序。
全栈程序员站长
2022/09/15
2K0
java冒泡排序代码_Java冒泡排序
【Java数据结构和算法】011-排序:冒泡排序、选择排序、插入排序、希尔排序*
冒泡排序(Bubble Sorting)的基本思想是:通过对待排序序列从前向后(从下标较小的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就像水底下的气泡一样逐渐向上冒;
訾博ZiBo
2025/01/06
1170
【Java数据结构和算法】011-排序:冒泡排序、选择排序、插入排序、希尔排序*
相关推荐
[排序算法]–冒泡排序的三种实现(Java)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验