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

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

时间:2023-11-28 13:00:31浏览次数:34  
标签:数列 int 元素 冒泡排序 算法 有序 array 排序

一:概述

对于冒泡排序的优化1中,右边的许多元素已经是有序的了,可是每一轮还是白白地比较多次了。

这个问题地关键点在于对数列有序区地界定。

按照现有的逻辑,有序区的长度和排序的轮数是相等的。例如第1轮排序过后的有序区长度是1,第2轮排序过后的有序长度是2....

实际上,数列真正的有序区可能会大于这个长度,如上述例子中在第2轮排序时,后面的5个元素实际上已经都已经是有序区了。因此后面的多次元素比较有意义的。

那么,如何避免这种情况呢?我们可以在每一轮排序之后,记录下来最后一次元素交换的位置,该位置即无序数列的边界,再往后就是有序区了。

二:具体代码

 public static void sort2(int[] array) {
         // 记录最后一次交换的位置
         int lastExchangeIndex = 0;
         // 无序数列的边界,每次比较只需要比到这里为止
         int sortBorder = array.length - 1;
         for(int i = 0; i < array.length - 1; i++) 
         {
          // 有序标记,每一轮的初始值都是true
          boolean isSorted = true;
          for(int j = 0; j < sortBorder; 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;
                  // 更新为最后一次交换元素的位置
                  lastExchangeIndex = j;
              }
          }
             sortBorder = lastExchangeIndex;
             if (isSorted) {
                 break;
             }
         }
     }

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

在这个代码中,sortBorder就是无序数列的边界。在每一轮的循环排序过程中,处于BorderIndex之后的元素就不需要在进行比较了,肯定就是有序的。

                                       排序算法之冒泡排序优化2_冒泡排序

                                       排序算法之冒泡排序优化2_数组_02


标签:数列,int,元素,冒泡排序,算法,有序,array,排序
From: https://blog.51cto.com/u_15912723/8599905

相关文章

  • 期望最大化(EM)算法:从理论到实战全解析
    本文深入探讨了期望最大化(EM)算法的原理、数学基础和应用。通过详尽的定义和具体例子,文章阐释了EM算法在高斯混合模型(GMM)中的应用,并通过Python和PyTorch代码实现进行了实战演示。关注TechLead,分享AI全维度知识。作者拥有10+年互联网服务架构、AI产品研发经验、团队管理经验,同济......
  • 期望最大化(EM)算法:从理论到实战全解析
    本文深入探讨了期望最大化(EM)算法的原理、数学基础和应用。通过详尽的定义和具体例子,文章阐释了EM算法在高斯混合模型(GMM)中的应用,并通过Python和PyTorch代码实现进行了实战演示。关注TechLead,分享AI全维度知识。作者拥有10+年互联网服务架构、AI产品研发经验、团队管理经验,同济......
  • 算法分析-寻找假币题
    一.题目需求你手里有70枚重量相等的真金硬币,但你知道其中有一枚是假币,比其他金币轻。你有一个平衡秤,你可以一次在两边放上任意数量的硬币,它会告诉你两边是否重量相同,或者如果不相同,哪边更轻。问题:请概述一个寻找假币的算法。你需要称量多少次?怎么使得称量次数最少?二、算法思想1......
  • C# Lambda 分组排序问题(先对数据进行时间倒序排列,然后再按照某字符分组,在每个分组内再
    问题:先对数据进行时间倒序排列,然后再按照某字符分组,在每个分组内再按照某数字或字符正序排列解答:vardata=list.OrderByDescending(i=>i.Date).ToList();vargData=data.GroupBy(g=>g.code).Select(l=>l.OrderBy(i=>i.Step));varinvData=newList<IndexVM>();fore......
  • 文心一言 VS 讯飞星火 VS chatgpt (145)-- 算法导论12.1 5题
    五、用go语言,因为在基于比较的排序模型中,完成n个元素的排序,其最坏情况下需要Ω(nlgn)时间。试证明:任何基于比较的算法从n个元素的任意序列中构造一棵二又搜索树,其最坏情况下需要Ω(nlgn)的时间。我个人喜欢灵小智。文心一言:首先,我们要明白二叉搜索树(BST)的性质:每个节点......
  • 差分算法总结
    差分是前缀和的逆运算一维差分对于a1,a2,…,an,构造b1,b2,…,bn,使得ai= b1+ b2 + …+bi。此时,b数组成为a数组的差分,a数组称为b数组的前缀和。题目链接:https://www.acwing.com/problem/content/799/代码模版:1#include<iostream>23usingnamespacestd;45co......
  • O(nlogn)排序算法
    排序算法介绍常见时间复杂度为\(O(nlogn)\)的排序算法1.快速排序分治思想#include<bits/stdc++.h>usingnamespacestd;constintN=1e5+10;inta[N];voidquick_sort(intl,intr){if(l>=r)return;intx=a[l+r>>1],i=l-1,j=r+1;......
  • DFS算法的非递归遍历分析
    两种写法,一个是边表顶点号全部压栈,一个是类似后序非递归遍历1、voidDFS(GraphG,inti){intp,w;StackS;InitStack(S);Push(S,i);visited[i]=true;while(!isEmpty(S)){Pop(S,p);printf("%d",G.Ver[p].num);......
  • 数字在排序数组中出现的次数--二分
    题目描述有序序列二分先对左端点进行二分再对右端点二分最后得到两个端点,直接相减+1,得到区间个数classSolution{public:intgetNumberOfK(vector<int>&nums,intk){if(nums.empty())return0;intl=0,r=nums.size()-1;while(l<r......
  • 数组作为函数参数(冒泡排序)
    往往我们在导代码的时候,会将数组作为参数传个函数,比如我们要实现一个冒泡排序:函数讲一个整形数组进行排序(主要讲算法思想)#include<stdio.h>voidbubble_sort(intarr[],intsz){inti=0;//确认冒泡函数的趟数//intsz=sizeof(arr)/sizeof(arr[0]);//注:这里不能在void函......