首页 > 其他分享 >排序-冒泡

排序-冒泡

时间:2023-03-21 23:03:09浏览次数:40  
标签:arr exchange int 复杂度 冒泡排序 冒泡 排序 condition

冒泡排序

简介
  • 冒泡排序属于一种交换排序,
  • 基本思想:所谓交换,就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置。
  • 交换排序的特点是:将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动
代码
public class BubbleSort {
    public static void main(String[] args) {
        int[] arr = new int[]{18, 4, 69, 3, 10, 20};
        int condition = arr.length - 1;
        for (int i = 0; i < condition; i++) {
            for (int j = 0; j < condition - i; j++) {   // 为什么是 -i,是因为前面循环了i次,就排好了几个,所以需要-i
                if (arr[j] < arr[j + 1]) {
                    int temp = arr[j + 1];  // 交换的逻辑,创建一个临时变量存储一下 需要调换的数值
                    arr[j + 1] = arr[j];
                    arr[j] = temp;
                }
            }
        }
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
    }
}

冒泡排序的时间复杂度:
  • 最坏情况
    最坏情况:逆序排顺序。假设有n个数,等差数列1+2+3+4+...+n。因此最坏的时间复杂度为O(n^2)。
  • 最好情况
    最好情况:有序排有序。对于冒泡排序来说,即使是有序仍然会把每个数进行冒泡。虽然有序,但是冒泡排序不知道呀,仍然按着老套路一个一个比较冒。因此最好的时间复杂度仍为O(n^2)。
优化思想
  • 我们定义一个变量,在冒泡的过程中,如果有两个数字进行交换,说明原序列不是有序的,但是如果冒一遍发现,没有数字记性交换,说明该序列是有序的,就没必要继续冒下去了。因此,我们可以定义一个exchange变量,其实赋值为0,如果冒一遍有交换,就让exchange = 1,如果没有交换,不改变exchange的值,我们最后只需要判断exchange的值即可的值序列是否有序。

  • 代码

    public class BubbleSort2 {
        public static void main(String[] args) {
            int[] arr = new int[]{18, 4, 69, 3, 10, 20};
            int condition = arr.length - 1;
            for (int i = 0; i < condition; i++) {
                int exchange = 0;
                for (int j = 0; j < condition - i; j++) {
                    if (arr[j]<arr[j+1]){
                        int temp = arr[j+1];
                        arr[j+1] = arr[j];
                        arr[j] = temp;
                        exchange = 1;
                    }
                }
                if (exchange == 0)
                    break;
            }
    
            for (int i = 0;i<arr.length -1;i++){
                System.out.println(arr[i]+" ");
            }
        }
    }
    
  • 优化算法的时间复杂度

    • 最坏情况 -- 最坏情况仍是逆序排顺序 时间复杂度O(n^2)

    • 最好情况 -- 本身就有序,我们在第一遍冒泡过程过,exchange没有改变,我们就break了。

      因此此时的时间复杂度是O(n)。

原文:https://blog.csdn.net/qq_58325487/article/details/124228754

标签:arr,exchange,int,复杂度,冒泡排序,冒泡,排序,condition
From: https://www.cnblogs.com/lipinbigdata/p/17241941.html

相关文章

  • 快速排序
    快速排序算法思想找一个主元x从左边找>=x的数,从右边找<=x的数然后交换位置递归地处理左右两部分时间复杂度O(nlogn)代码voidquick_sort(intq[],intl......
  • java实现多字段排序(普通对象List和MapList)
    publicclassSortTest{publicstaticvoidmain(String[]args){//普通对象listsortVOList();//mapListsortMapList();......
  • Treemap按key和value降序排序
    Treemap是一种根据键排序的数据结构,可以通过重载它的比较器来按照值排序。要按键排序,可以使用默认的比较器,而要按值排序,可以创建一个自定义的比较器并将其传递给treemap的......
  • 【数据结构与算法】堆与堆排序
    堆与堆排序1堆的概念堆用于维护一个数集。堆是一个完全二叉树小根堆:每个结点都小于等于它的左右子结点(递归定义)推论:每个结点都是以其为根节点的子树的最小值......
  • 26.删除排序数组中的重复项——学习笔记
    题目:给你一个升序排列的数组nums,请你原地删除重复出现的元素,使每个元素只出现一次,返回删除后数组的新长度。元素的相对顺序应该保持一致。由于在某些语言中不能改变数组......
  • 34.在排序数组中查找元素的第一个和最后一个位置——学习笔记
    题目:给你一个按照非递减顺序排列的整数数组nums,和一个目标值target。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值target,返回[-1,-1]。......
  • 力扣---剑指 Offer 53 - I. 在排序数组中查找数字 I
    统计一个数字在排序数组中出现的次数。示例1:输入:nums=[5,7,7,8,8,10],target=8输出:2示例 2:输入:nums=[5,7,7,8,8,10],target=6输出:0提示:......
  • 如何用C语言对十亿数据排序大体就是用分块法把十亿个随机数据排序?
    分析过程将十亿个数据按照一定的规则分成若干个块,每个块包含M个数据,其中M是一个适当的大小,可以根据实际情况进行调整。1、对每个块内的数据进行排序,可以使用快速排序、归......
  • mysql5.6以下排序
    SELECTtt.id,(@rowNum:=@rowNum+1)ASrankingFROM(select5asidunionallselect4asidunionallselect3asidunionallselect2asidunionall......
  • matlab sortrows函数 对行进行排序
    用法:B=sortrows(A)B=sortrows(A,column)第一种和第二种用法的区别在于,sortrows(A)将类似按照字典序排列,而指定了column时,各行只根据指定列为标准来排序,不考虑其他列的......