首页 > 编程语言 >9.排序算法

9.排序算法

时间:2022-11-25 12:35:19浏览次数:36  
标签:11 10 arr int 内层 算法 排序

1.冒泡排序

基本介绍:

  冒泡排序的基本思想是:通过对待排序序列从前向后(从下标较小的元素开始),一次比较相邻元素的值,如果发现逆序,使较大的元素逐渐从前向后移动。

 

因为在排序的过程中,各元素不断的接近自己的位置,如果一趟比较下来没有进行任何交换,就说明序列有序。因此要在排序过程中设置一个标志flag,判断元素是否进行交换,从而减少不必要的比较。(后期优化)

示例:

public class BubbleSort {
    public static void main(String[] args) {
        int arr[] = {11,3, 9, -1, 10, -2};
        int count=0;
        //冒泡排序
        //第一层for循环是循环次数:例如5个数,总共循环5-1=4次
        System.out.println("原始数据: "+Arrays.toString(arr));
        System.out.println("开始排序------");
        for (int i = 0; i < arr.length - 1; i++) {
            //第二层for循环,是比较次数
            for (int j = 0; j < arr.length - i - 1; j++) {
                if (arr[j] > arr[j + 1]) {
                    int num=arr[j];
                    arr[j]=arr[j+1];
                    arr[j+1] = num;
                }
                System.out.println("第"+(count++)+"次排序:"+Arrays.toString( arr));
            }
            System.out.println("内层排序结束---");
        }
    }
}

输出:

原始数据: [11, 3, 9, -1, 10, -2]
开始排序------
第0次排序:[3, 11, 9, -1, 10, -2]
第1次排序:[3, 9, 11, -1, 10, -2]
第2次排序:[3, 9, -1, 11, 10, -2]
第3次排序:[3, 9, -1, 10, 11, -2]
第4次排序:[3, 9, -1, 10, -2, 11]
内层排序结束---
第5次排序:[3, 9, -1, 10, -2, 11]
第6次排序:[3, -1, 9, 10, -2, 11]
第7次排序:[3, -1, 9, 10, -2, 11]
第8次排序:[3, -1, 9, -2, 10, 11]
内层排序结束---
第9次排序:[-1, 3, 9, -2, 10, 11]
第10次排序:[-1, 3, 9, -2, 10, 11]
第11次排序:[-1, 3, -2, 9, 10, 11]
内层排序结束---
第12次排序:[-1, 3, -2, 9, 10, 11]
第13次排序:[-1, -2, 3, 9, 10, 11]
内层排序结束---
第14次排序:[-2, -1, 3, 9, 10, 11]
内层排序结束---

结论:发现每次排序都会把最大数放在结尾处!

 

优化,先看案例:

如果给int arr[] = {1, 2, 3, 5, 4}排序呢
输出:
    原始数据: [1, 2, 3, 5, 4]
    开始排序------
    第0次排序:[1, 2, 3, 5, 4]
    第1次排序:[1, 2, 3, 5, 4]
    第2次排序:[1, 2, 3, 5, 4]
    第3次排序:[1, 2, 3, 4, 5]
    内层排序结束---
    第4次排序:[1, 2, 3, 4, 5]
    第5次排序:[1, 2, 3, 4, 5]
    第6次排序:[1, 2, 3, 4, 5]
    内层排序结束---
    第7次排序:[1, 2, 3, 4, 5]
    第8次排序:[1, 2, 3, 4, 5]
    内层排序结束---
    第9次排序:[1, 2, 3, 4, 5]
    内层排序结束---

发现3-9次的排序均一样的,这就是优化的点!
    public static void main(String[] args) {
        int arr[] = {1, 2, 3, 5, 4};
        int count = 0;
        //冒泡排序
        //第一层for循环是循环次数:例如5个数,总共循环5-1=4次
        System.out.println("原始数据: " + Arrays.toString(arr));
        System.out.println("开始排序------");
        //重点1:表示是否进行过交换
        boolean flag = false;
        for (int i = 0; i < arr.length - 1; i++) {
            //第二层for循环,是比较次数
            for (int j = 0; j < arr.length - i - 1; j++) {
                if (arr[j] > arr[j + 1]) {
                    int num = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = num;
                    //重点2:如果发生交换,该字段置为true;
                    flag = true;
                }
                System.out.println("第" + (count++) + "次排序:" + Arrays.toString(arr));
            }
            //内层排序结束后,判断这个字段
            //没有进行过交换,直接退出!
            if (!flag) {
                break;
            } else {
                //flag=true:进行过交换,这里需要重置下flag,方便下次判断!
                flag = false;
            }
            System.out.println("内层排序结束---");
        }
    }
    
输出:发现减少了3次排序
    原始数据: [1, 2, 3, 5, 4]
    开始排序------
    第0次排序:[1, 2, 3, 5, 4]
    第1次排序:[1, 2, 3, 5, 4]
    第2次排序:[1, 2, 3, 5, 4]
    第3次排序:[1, 2, 3, 4, 5]
    内层排序结束---
    第4次排序:[1, 2, 3, 4, 5]
    第5次排序:[1, 2, 3, 4, 5]
    第6次排序:[1, 2, 3, 4, 5]
 内层排序无法减少,即3-6的排序是无法精简的,因为内层排序是元素一位一位去比较,根本不知道后面元素的大小,两次比较结果相同,并不能说明已经有序:如
 本以为这么修改:
         //上次排序结果
        String str="";
        for (int i = 0; i < arr.length - 1; i++) {
            //第二层for循环,是比较次数
            for (int j = 0; j < arr.length - i - 1; j++) {
                if (arr[j] > arr[j + 1]) {
                    int num = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = num;
                }
                //重点1:比较上次移动和这次的字符串是否一样
                if (str.equals(Arrays.toString(arr))) {
                    break;
                }
               str=Arrays.toString(arr);
                System.out.println("第"+(count++)+"次排序:"+str);
            }
            System.out.println("内层排序结束---");
        }
输出;
原始数据: [1, 2, 3, 5, 4]
开始排序------
第0次排序:[1, 2, 3, 5, 4]
内层排序结束---
    
结论:    
这时还没有有序,内层排序无法减少优化!

 

标签:11,10,arr,int,内层,算法,排序
From: https://www.cnblogs.com/wmd-l/p/16924692.html

相关文章

  • 设计排序可视化
    1.https://opencv.org/releases/在此网站下载opencv4.5.5库2.安装opencvhttps://blog.csdn.net/m0_47472749/article/details/111328183https://blog.csdn.net/CaiSen......
  • 5分钟搞定快速排序
    快速排序思想    最开始找出一个基准值,通过一趟排序将待排序的序列分割成独立的两个部分,前面的这一部分元素都比基准值小,后面这一部分的元素都比基准值大。然后分别再对......
  • LeetCode 154.寻找旋转排序数组中的最小值II
    LeetCode154.寻找旋转排序数组中的最小值II题目链接:​​https://leetcode-cn.com/problems/find-minimum-in-rotated-sorted-array-ii/​​题目描述:已知一个长度为 n ......
  • LeetCode 81.搜索旋转排序数组II
    LeetCode81.搜索旋转排序数组II题目链接:​​https://leetcode-cn.com/problems/search-in-rotated-sorted-array-ii/​​题目描述:已知存在一个按非降序排列的整数数组 n......
  • LeetCode 34.在排序数组中查找元素的第一个和最后一个位置
    LeetCode34.在排序数组中查找元素的第一个和最后一个位置题目链接:​​https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array/​​......
  • 算法基础:子矩阵的和
    算法:子矩阵的和以(x1,y1)为左上角,(x2,y2)为右下角的子矩阵的和为:s[x2,y2]-s[x1-1,y2]-s[x2,y1-1]+s[x1-1,y1-1]#include<bits/stdc++.h>using......
  • 算法基础
    算法:前缀和#include<bits/stdc++.h>usingnamespacestd;constintN=1e5+10;inta[N],s[N];//s[N]前缀和数组s[i]=a[1]+a[2]+a[3]+...+a[i]int......
  • 每日算法之二维数组中的查找
    JZ4二维数组中的查找描述在一个二维数组array中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这......
  • P6186 [NOI Online #1 提高组] 冒泡排序
    随便给出一组数据:53124初始逆序对数量:\(6\)。冒泡排序一轮:31245\(6-4=2\)。两轮:12345\(2-2=0\)。观察会发现,数\(x\)会一直后退,直到有一个大于\(......
  • 算法5: LeetCode_单链表_两数相加
    题目:*给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。*请你将两个数相加,并以相同形式返回一个......