首页 > 编程语言 >冒泡排序的具体思想和算法实现以及改进

冒泡排序的具体思想和算法实现以及改进

时间:2024-08-01 18:28:18浏览次数:10  
标签:int 位置 交换 算法 冒泡排序 改进 length 大于 对比

冒泡排序——稳定算法

从小到大排序:

0~length-1

对比a[0]和a[1],如果前一个大于后一个,交换位置。

对比a[1]和a[2],如果前一个大于后一个,交换位置。

对比a[2]和a[3],如果前一个大于后一个,交换位置。

...

对比a[length-2]和a[length-1],如果前一个大于后一个,交换位置。

第一轮结果下来就是把最大值放在了最后面

0~length-2

对比a[0]和a[1],如果前一个大于后一个,交换位置。

对比a[1]和a[2],如果前一个大于后一个,交换位置。

对比a[2]和a[3],如果前一个大于后一个,交换位置。

...

对比a[length-3]和a[length-2],如果前一个大于后一个,交换位置。

第二轮结果下来就是把第二大值放在倒数第二个

改进——记录最后一次交换的索引位置,作为下一次冒泡的比较次数 (该位置后的元素均已有序

Java代码如下: 

public class BubbleSort {

    public static void main(String[] args) {
        int[] arr = {5, 3, 8, 6, 2, 7, 1, 4};
        bubbleSort(arr);
    }
    private static void bubbleSort(int[] arr) {
        int n=arr.length-1;
        while(true){
//            最后一次交换索引的位置
            int last=0;
            for(int i=0;i<n;i++){
                if(arr[i+1]<arr[i]){
                    int temp=arr[i+1];
                    arr[i+1]=arr[i];
                    arr[i]=temp;
                    last=i;
                }
            }
            printArr(arr);
            n=last;
//            说明没交换过 即有序 不用再冒泡了
            if(n==0) break;
        }
    }
    private static void printArr(int[] arr){
        for(int i=0;i<arr.length;i++){
            System.out.print(arr[i]+" ");
        }
        System.out.println();
    }
}

标签:int,位置,交换,算法,冒泡排序,改进,length,大于,对比
From: https://blog.csdn.net/a486368464/article/details/140789986

相关文章

  • 【算法】浅析线性规划算法【附完整示例】
    线性规划算法:优化资源配置,提升经济效益1.引言在现代社会,资源优化配置是提高经济效益的关键。线性规划算法作为一种优化工具,广泛应用于经济学、工程学、管理学等领域。本文将带你了解线性规划算法的原理、使用方法及其在实际应用中的意义,并通过代码示例和图示帮助大家更好......
  • 选择插入排序改进思路加算法实现
    首先默认第一个元素是已排序的,剩下元素是待排序的,从第二个元素开始遍历取出待排序区域的第一个元素element和已排序区域的最后一个元素a[j]往前开始比较大小若待排元素大于等于最后一个元素则直接跳出循环将待排元素赋值给a[j+1]若待排元素小于最后一个元素将最后一个元......
  • 折半插入排序算法思想及代码实现
    折半插入排序(BinaryInsertionSort)是插入排序算法的一种优化版本。插入排序的基本思想是将一个记录插入到已经排序好的有序表中,从而得到一个新的、记录数增加1的有序表。传统的插入排序在寻找插入位置时,采用的是顺序比较的方式,即逐个与有序表中的元素进行比较,直到找到比待插入......
  • 数据结构与算法 - 递归
    一、递归1. 概述定义:在计算机科学中,递归是一种解决计算问题的方法,其中解决方案取决于同一类问题的更小子集。比如单链表递归遍历的例子:voidf(Nodenode){if(node==null){return;}println("before:"+node.value)f(node.next);pr......
  • 数据结构与算法 - 链表
    一、链表1.概述定义:在计算机科学中,链表是数据元素的线性集合,其每个元素都指向下一个元素,元素存储上并不连续。可以分类为:单向链表,每个元素只知道其下一个元素是谁双向链表,每个元素直到其上一个元素和下一个元素循环链表,通常的链表尾节点tail指向的都是null,而循环链表......
  • OpenSSH秘钥指纹图像生成算法
    OpenSSH秘钥指纹图像生成算法使用SSH秘钥生成时产生疑惑,它的randomartimage是如何生成的?下面进行了探索和研究引入生成位数为4096位的rsa公私钥ssh-keygen-trsa-b4096Generatingpublic/privatersakeypair.Enterfileinwhichtosavethekey(/root/.s......
  • 第2章 基础算法
    2.1初级(1)尺取法⭐反向扫描(左右指针)hdu2029Palindromes_easyversionimportjava.util.Scanner;publicclassMain{ publicstaticvoidmain(String[]args){ Scannersc=newScanner(System.in); intn=sc.nextInt(); for(;n>0;n--){ char[]s......
  • 论文阅读:高效的广义最稠密子图发现算法
    摘要这篇论文提出了一种高效算法,通过利用广义超模密度定义和......
  • 机器学习-算法分类以及用途
    1.监督学习算法线性回归(LinearRegression)目的:用于预测一个或多个自变量(X)与因变量(Y)之间的线性关系。应用领域:房价预测、销售预测、温度预测等连续值预测问题。逻辑回归(LogisticRegression)目的:虽然名为回归,但实际上是用于二分类问题的分类算法。应用领域:垃圾邮件识别、......
  • prim算法求最小生成树
    prim算法求最小生成树#include<bits/stdc++.h>usingnamespacestd;constintN=600;intg[N][N];//n的平方约等于m,所以用邻接矩阵,存放权值。g[i][j]表示边ij的长度为g[i][j]constintinf=0x3f3f3f3f;//无穷大0x3f3f3f3fintdist[N];//该点到集合里点的最小值boolst[N]......