冒泡排序和局部冒泡排序

2024-08-26 20:08
文章标签 冒泡排序 局部

本文主要是介绍冒泡排序和局部冒泡排序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

冒泡排序

    冒泡排序(Buble Sort)作为一种简单的排序算法,比较容易理解,所以初学算法时候对冒泡排序理解清楚对于以后学习更加复杂的算法会有不小的帮助,所以学习一下冒泡排序还是非常有必要的.

    冒泡排序大致想法就是:从第一个开始比较相邻两个元素的值,如果它们的顺序不符合要求就换过来.直到最后一个元素,将最大或者最小的元素沉底.

    冒泡排序具体运作可以分为以下几步(以由小到大排列为例):

  1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
  2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
  3. 针对所有的元素重复以上的步骤,除了最后一个。
  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

       冒泡排序的动画演示如下

        

   下面是Java的冒泡排序:

public class BubbleSort{public static void main(String[] args){int score[] = {9,4,5,6,8,3,2,7,10,1};for (int i = 0; i < score.length -1; i++){    //最多做n-1趟排序for(int j = 0 ;j < score.length - 1 - i; j++){   //对当前无序区间score[0......length-i-1]进行排序(j的范围很关键,这个范围是在逐步缩小的,建议大家写成score.length-1-i这样比较容易理解每趟比较结束后j的范围)if(score[j] > score[j + 1]){    //把大的值交换到后面int temp = score[j + 1];score[j + 1] = score[j];score[j] = temp;}}            System.out.print("第" + (i + 1) + "次排序结果:");for(int a = 0; a < score.length; a++){System.out.print(score[a] + "\t");}System.out.println("");  }System.out.print("最终排序结果:");for(int a = 0; a < score.length; a++){System.out.print(score[a] + "\t");}}}
    可能大家不明白我为什么要没排一次输出一次,但是如果你做了,你就会发现一些问题,请看下图:

        
    看到这张图,首先,来看冒泡的特点,观察每次排序最后一个数,就是我们需要沉底的数,每趟比较结束后都将本趟比较中最大的数排到本趟的最后.

    其次,我们要知道,冒泡排序的比较次数非常的多,一共比较n(n-1)/2次.

局部冒泡排序

      概念:对于N个无序数据,我们在进行一趟冒泡排序时,如果第k个数据和第k+1个数据逆序(不符合排序的要求),那么对第k+1个数据进行一趟向前的冒泡排序,使其移动到合适的位置,也就是说让前面k+1个数据调节为正序。因为这种冒泡法只对前k+1个数据冒泡处理,所以我们称它为——局部冒泡。
    看代码:
public class PartBubbleSort{public static void main(String[] args){int score[] = {9,4,5,6,8,3,2,7,10,1};for (int i = 0; i < score.length -1; i++){    //最多做n-1趟排序if(score[i]>score[i + 1]){int j = 0;int temp = 0;j = i + 1;while(j > 0 && score[j] < score[j - 1]){temp=score[j];score[j]=score[j - 1];score[j - 1] = temp;j--; }}System.out.print("第" + (i + 1) + "次排序结果:");for(int a = 0; a < score.length; a++){System.out.print(score[a] + "\t");}System.out.println("");  }System.out.print("最终排序结果是:");for(int a = 0; a < score.length; a++){System.out.print(score[a] + "\t");}}}
    局部冒泡的思想是对于一开始不符合要求的一组才比较,局部冒泡排序算法至少需进行1 趟扫描, 至多需进行n- 1 趟扫描(其中只有一趟扫描是全局的, 其余趟扫描都是局部扫描, 扫描范围相对小得多。即在待排序数据初始有序( 正序) 情况下, 关键字的比较次数为n- 1, 数据的移动次数为0; 在待排序数据初始逆序的情况下, 关键字的比较次数为n ( n- 1) / 2, 最坏情况下, 每一次比较均会发生数据的交换, 即移动次数为3 n( n- 1) / 2。显然局部冒泡排序与冒泡排序算法具有相同的时间复杂度, 并且在正序和逆序的情况下, 所需的关键字的比较次数和移动次数完全相同。
    下面是输出的结果:
        
    那么局部冒泡的优势在哪里呢?其实,局部冒泡还是胜在比较次数看下面的对比:


注:测试所用数据均为随机产生的32 位非负整数,由于测试程序的统计量不是运行时间, 所以表1 中的测试结果不依赖于具体计算机的软、硬件等环境因素, 而仅与算法有关。(表摘自点击打开链接)

由上图可见,局部冒泡法的平均移动次数等于冒泡法,但是局部冒泡法的平均比较次数小于冒泡法。

   

这篇关于冒泡排序和局部冒泡排序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1109550

相关文章

AI基础 L9 Local Search II 局部搜索

Local Beam search 对于当前的所有k个状态,生成它们的所有可能后继状态。 检查生成的后继状态中是否有任何状态是解决方案。 如果所有后继状态都不是解决方案,则从所有后继状态中选择k个最佳状态。 当达到预设的迭代次数或满足某个终止条件时,算法停止。 — Choose k successors randomly, biased towards good ones — Close

冒泡排序——基于Java的实现

简介    冒泡排序(Bubble Sort)是一种简单的排序算法,适用于小规模数据集。其基本思想是通过重复遍历待排序的数组,比较相邻的元素并交换它们的位置,以此将较大的元素逐步“冒泡”到数组的末尾。算法的名称源于其运行过程中,较大的元素像水中的大气泡一样逐渐浮到顶部。  排序过程   for (int i = 0; i < num.length - 1; i++) {

Matlab中BaseZoom()函数实现曲线和图片的局部放大

BaseZoom工具下载链接: 链接:https://pan.baidu.com/s/1yItVSinh6vU4ImlbZW6Deg?pwd=9dyl 提取码:9dyl 下载完之后将工具包放置合适的路径下,并在matlab中“设置路径”中添加相应的路径; 注:可以先运行如下图片中的语句,看看是否报错;如果报如下错误,说明matlab未安装“Image Processing Toolbox”工

BubbleSort(冒泡排序)

平均时间 复杂度 最差时间 复杂度 最佳时间 复杂度 空间复杂度 O(n^2) O(n^2) O(n) O(1) 稳定 public static void bubbleSort( int[] arr ) {if( arr == null | arr.length < 2 ) {return;}for( int j = arr.length - 1; j > 0;

冒泡排序【BubbleSort】

冒泡排序 假设初始的数组是[5,4,7,2] 以从小到大排序为例: 将第0个元素与第一个元素进行比较, 5 > 4, 所以交换位置, 此时[4,5,7,2] 将第1个元素与第二个元素进行比较, 5 < 7, 所以保持,此时[4,5,7,2] 将第2个元素与第三个元素进行比较, 7 > 2, 所以交换位置, 此时[4,5,2,7] 这样就经过了一轮的冒泡,最后一个元素就是最大的元素了。

冒泡排序和鸡尾酒排序(code)

昨天回顾了下冒泡排序和鸡尾酒排序,用面向对象的方式写了一下,并且优化了代码,记录一下~ 一、冒泡排序 # 冒泡排序class BubbleSort(object):def __init__(self, data_list):self.data_list = data_listself.length = len(data_list)# 简单粗暴的排序方式def b_sort(self):d

【C++】【日志贴】浅谈标准库类型string、vector及C风格字符串在全局和局部作用域中默认初始值情况

平时练习发现这个问题,记录一下。 C风格字符串在全局和局部作用域中初始值情况【空字符+未定义的字符】由于内存没有初始化造成的对于栈,内存如果没有初始化,则会出现“烫烫烫烫烫烫”;对于堆,内存如果没有初始化,则会出现“屯屯屯屯屯”;有时候数组没有结束符,输出数组也会有这些汉字的出现,就是因为没有结束符占用了后面的空闲的内存块即没有初始化的内存块 标准库类型string

冒泡排序算法及其简单优化(基于Java)

冒泡排序算法通过多次比较和交换来实现排序,其流程如下: (1)对数组中的各数据,依次比较相邻两个元素的大小。 (2)如果前面的数据大于后面的数据,就交换这两个数据。通过第一轮的多次比较排序后,便可将最小的数据排好。 (3)再用同样的方法把剩下的数据逐个进行比较,最后便可按照从小到大的顺序排好数组的各数据。 所谓“冒泡”,就是大数沉下去(数组的底部),小数相应的浮上来(数组的顶部)。

Java基础07 数组算法(顺序查找、冒泡排序、选择排序、二分查找)

超详细的Java知识点路线图 前言 知道了怎么使用数组后,还需要结合数组和前面的知识,解决某些实际的问题。 本文我们将学习数组的常用算法:求最大值、顺序查找、二分查找、冒泡排序、选择排序。 如果能掌握这些算法,那么大家的编程能力会得到很大增强哦。 求最大值 给定一个数组,求出所有数据中最大(最小)的数据 算法描述: 定义最大值变量,将数组中第一个数据赋值给最大值从数组的第二个数据开始

YOLOv8改进实战 | 引入混合局部通道注意力模块MLCA(2023轻量级)

YOLOv8专栏导航:点击此处跳转 前言 YOLOv8 是由 YOLOv5 的发布者 Ultralytics 发布的最新版本的 YOLO。它可用于对象检测、分割、分类任务以及大型数据集的学习,并且可以在包括 CPU 和 GPU 在内的各种硬件上执行。 YOLOv8 是一种尖端的、最先进的 (SOTA) 模型,它建立在以前成功的 YOLO 版本的基础上,并引入了新的功能和改进