首页 > 编程语言 > 排序算法之冒泡排序优化1

排序算法之冒泡排序优化1

时间:2023-11-27 19:01:37浏览次数:39  
标签:小于 数列 int 元素 冒泡排序 算法 array 排序 不变

一:概述

原始的数列{4, 8, 6, 3, 9,2,1, 7},执行至第6步和第7步时,数列状态如下:

                            排序算法之冒泡排序优化1_数列有序

很明显的可以看出,经过第6轮排序之后,整个数列已然是有序的了。可是排序算法依然是继续执行第7轮排序。

在这种情况下,如果能判断出数列已经有序,并作出标记,那么剩下的几轮就不必执行了,可以提前结束。

二:具体代码

优化的代码如下:

 public static void sort(int[] array)
     {
       for(int i = 0; i < array.length -1; i++) {

           // 有序标记,每一轮的初始值都是true
           boolean isSorted = true;
           for(int j = 0; j < array.length - i - 1; j++) {
               int tmp = 0;
               if(array[j] > array[j + 1]) {
                   tmp = array[j];
                   array[j] = array[j + 1];
                   array[j + 1] = tmp;
                  // 因为有元素进行交换,所以不是有序的,标记变为false
                  isSorted = false;
               }
           }
           if(isSorted) {
               break;
           }
       }
     }




public static void main(String[] args) {
         // 定义数组
         int[] array = new int[]{5, 8, 6, 3, 9, 2, 1, 7};
         // 调用冒泡排序的方法
         sort(array);
         System.out.println(Arrays.toString(array));
     }

与第一版的代码相比,第二版的代码做了小小的改动,利用布尔变量isSorted作为标记。如果在本轮排序中,元素有交换,则说明无序;如果没有元素交换,则说明数列已然有序,然后直接跳出大循环。

下面以一个新的数列为例说明。

                            排序算法之冒泡排序优化1_冒泡排序_02

这个数列的特点就是前半部分的元素(3、4、2、1)无序,后半部分的元素(5、6、7、8)按升序排列,并且后半部分元素中的最小值也大于前半部分元素的最大值。

下面按照冒泡排序的思路进行排序,看看效果:

第一轮

                            排序算法之冒泡排序优化1_升序_03

元素4和5比较,发现4小于5,所以位置不变。

元素5和6比较,发现5小于5,所以位置不变。

元素6和7比较,发现6小于7,所以位置不变。

元素7和8比较,发现7小于8,所以位置不变。

第1轮结束,数列有序区包含1个元素。

                            排序算法之冒泡排序优化1_升序_04

第二轮

元素3和2比较,发现3大于2,所以3和2交换。

                            排序算法之冒泡排序优化1_冒泡排序_05

元素3和4比较,发现3小于4,所以位置不变。

元素4和5比较,发现4小于5,所以位置不变。

元素5和6比较,发现5小于6,所以位置不变。

元素6和7比较,发现6小于7,所以位置不变。

元素7和8比较,发现7小于8,所以位置不变。

第2轮结束,数列有序区包含两个元素。

标签:小于,数列,int,元素,冒泡排序,算法,array,排序,不变
From: https://blog.51cto.com/u_15912723/8587592

相关文章

  • 最小生成树(Kruskal和Prim算法)
    最小生成树(Kruskal和Prim算法)部分资料来源于:最小生成树(Kruskal算法)_kruskal算法求最小生成树-CSDN博客、【算法】最小生成树——Prim和Kruskal算法-CSDN博客关于图的几个概念定义:连通图:在无向图中,若任意两个顶点vi与vj都有路径相通,则称该无向图为连通图。强连通图:在有向图中,若......
  • Proj4:改进LiteOS中物理内存分配算法
    Proj4:改进LiteOS中物理内存分配算法实验目的掌握LiteOS系统调用的自定义方法实验环境Ubantu和IMX6ULLmini实验内容(从代码角度详细描述实验的步骤和过程)原先代码:1/*23*Description:findsuitablefreeblockuse"bestfit"algorithm45*Input......
  • MD5加密算法
    MD5MD5是一种不可逆的加密算法。可以产生出一个128位(16字节)的散列值(hashvalue),用于确保信息传输完整一致md5的特性压缩性:任意长度的数据,算出的MD5值长度都是固定的。容易计算:从原数据计算出MD5值很容易。抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都......
  • 文心一言 VS 讯飞星火 VS chatgpt (144)-- 算法导论12.1 4题
    四、用go语言,对于一棵有n个结点的树,请设计在O(n)时间内完成的先序遍历算法和后序遍历算法。我个人喜欢灵小智。文心一言:在Go语言中,我们可以使用递归来实现树的前序遍历和后序遍历。以下是实现这两种方法的代码。首先,我们定义一个树节点的结构:typeTreeNodestruct{V......
  • 文心一言 VS 讯飞星火 VS chatgpt (144)-- 算法导论12.1 4题
    四、用go语言,对于一棵有n个结点的树,请设计在O(n)时间内完成的先序遍历算法和后序遍历算法。我个人喜欢灵小智。文心一言:在Go语言中,我们可以使用递归来实现树的前序遍历和后序遍历。以下是实现这两种方法的代码。首先,我们定义一个树节点的结构:typeTreeNodestruct{......
  • 【调度算法】开放车间调度问题遗传算法
    问题描述开放车间调度问题可以描述为:有n个需要加工的工件,每个工件有m道工序,需要在m台不同的机器上进行加工,每道工序的加工时间都是已知的,但是每个工件的加工顺序是任意的;一台机器在同一个时刻只能加工一个工件,一个工件不能同时在两台机器上加工;每个工件在同一时刻也只能在某一台......
  • 选择法排序——c语言
    #include<stdio.h>intmain(){inti,min,z,j,temp,k,n=11;intbe[]={1,4,6,9,13,16,19,28,40,100,0};scanf("%d",&z);be[10]=z;for(i=0;i<n-1;i++){min=i;for(j=i+1;j<n;j++){if(be[min]......
  • 时间复杂度为 O(nlogn) 的排序算法 | 京东物流技术团队
    归并排序归并排序遵循分治的思想:将原问题分解为几个规模较小但类似于原问题的子问题,递归地求解这些子问题,然后合并这些子问题的解来建立原问题的解,归并排序的步骤如下:划分:分解待排序的n个元素的序列成各具n/2个元素的两个子序列,将长数组的排序问题转换为短数组的排序问题,当待排......
  • floyd算法
    FLOYD复杂度Floyd-Warshall算法的时间复杂度为O(|V|^{3})[4],空间复杂度为O(|V|^{2}),其中V是点集。原理动态规划适用范围Floyd-Warshall算法适用于解决带权有向图或带权无向图的全源最短路径问题,即计算任意两个顶点之间的最短路径长度。Floyd-Warshall算法的适用范围包......
  • KMP算法
    #include<iostream>usingnamespacestd;int*getNext(stringpattern){int*next=(int*)malloc(sizeof(int)*pattern.size());if(next==NULL){returnNULL;}next[0]=-1;intj=-1;for(inti=1;i<p......