JavaSE—排序问题

排序——排序不是去背代码而是理解思想流程

  1. 冒泡排序—核心算法:当前元素与他后一个元素进行比较
    他的稳定性高
    eg: 6 4 9 1 8 3 2 7 5
    第一次:6和4比,6大4小两数交换位置
    在这里插入图片描述
    第二次:6和9比,位置不变
    在这里插入图片描述
    第三次:9和1比,9大1小位置交换
    在这里插入图片描述
    第四次:9和8比,9大8小位置交换
    在这里插入图片描述
    第五次:9和3比,9大3小位置交换
    在这里插入图片描述
    第六次:9和2比,9大2小位置交换
    在这里插入图片描述
    第七次:9和7比,9大7小位置交换
    在这里插入图片描述
    第八次:9和5比,9大5小位置交换
    在这里插入图片描述
    这样我们就将这个数组中的最大数排出来了。
    所以得到以下的规律
    第一轮 从角标0开始到角标7 我们比较了八次.
    第二轮 从角标0开始到角标6 我们比较了七次.
    第三轮 从角标0开始到角标5 我们比较了六次.
    第四轮 从角标0开始到角标4 我们比较了五次.
    第五轮 从角标0开始到角标3 我们比较了四次.
    第六轮 从角标0开始到角标2 我们比较了三次.
    第七轮 从角标0开始到角标1 我们比较了二次.
    第八轮 从角标0开始到角标0 我们比较了一次
    所以我们可以使用嵌套循环来求解冒泡循环
    代码求解如下:
    在这里插入图片描述
  2. 选择排序—核心算法:当前数字与后边的每一个数字都要比一下
    他的稳定性差
    eg: 6 4 9 1 8 3 2 7 5
    从角标0开始,跟后边的每一个经行相比
    第一次:六和四比,六大四小位置交换
    在这里插入图片描述
    第二次:四和九比,位置不变
    在这里插入图片描述
    第三次:四和一比,四大一小位置交换
    在这里插入图片描述
    第四次:一和八比,位置不变
    第五次:一和三比,位置不变
    第六次:一和二比,位置不变
    第七次:一和七比,位置不变
    第八次:一和五比,位置不变
    这样我们就将这个数组中的最小数找出来了
    所以得到以下的规律
    第一轮 从角标0开始到角标8
    第二轮 从角标1开始到角标8
    第三轮 从角标2开始到角标8
    第四轮 从角标3开始到角标8
    第五轮 从角标4开始到角标8
    第六轮 从角标5开始到角标8
    第七轮 从角标6开始到角标8
    第八轮 从角标7开始到角标8
    求解代码如下:
    在这里插入图片描述
  3. 插入排序—核心思想:第一个数字不看,从第二个数字开始看
    并不是每个元素和其它元素经行比较,如果左边的数字比当前小,意味着左边的一切都比它小且有序
    插入排序的效率高,并且是稳定的。
    eg: 6 4 9 1 8 3 2 7 5
    插入排序继续的条件:a.当前数本身的左边有数且比他大。 b.j-1>0
    i的左边有数字且比他大,所以两数交换,且j随着i的数字位置改变而改变位置
    在这里插入图片描述这时候j-1小于0,则i++,并且j移动到i的位置
    在这里插入图片描述在这里插入图片描述然后再次判断,i的左边有数字,但比i小所以j不动,i直接++
    在这里插入图片描述i的左边有数字并且比他大,则两数交换位置,j–,一直到j的左边无数字或者j-1<j
    在这里插入图片描述在这里插入图片描述这个时候j-1没有数字,则i++
    在这里插入图片描述在这里插入图片描述继续交换左右两个数,一直到i为角标8,这个数组就算全部遍历结束.
    实现代码如下
    在这里插入图片描述但是上述方法有一点点的复杂,我们可以有一种更优化的方法
    eg:1 2 4 5 6 3
    在这里插入图片描述i继续位置二开始判断,然后得到下图
    在这里插入图片描述这个时候我们就需要判断数字三的位置,但是如果按照上述方法,我们就需要将三前边的每一个数字与他相比,太过与麻烦
    所以我们可以作设置一个中间变量,用来存放a[i]的数字,然后j-1与这个中间变量相比较,如果j-1上有数字,且j-1的数字大于这个中间变量,则将j-1的值赋给j,一直到j-1小于中间变量,这时候将中间变量的值赋给j.
    代码实现如下
    在这里插入图片描述
  4. 计数排序 非比较类排序(哈希表的一种应用) 只适用于数字
    让数组中的最小值和角标0对应,最大值和数组长度-1对应
    数字和角标之间的偏移我们称之为差值
    eg:4,3,2,2,1,6,3,7,4,8,4,7,2,3,-2,-3

计数排序的结题思路为:
1.先for循环找到数组中的最大值和最小值
2.确定一个合适的数组区间(哈希表),确定数字与角标之间的偏移量
3.给你建立的哈希数组遍历赋值,然后打印哈希数组

实现代码如下
在这里插入图片描述

发布了22 篇原创文章 · 获赞 3 · 访问量 351

猜你喜欢

转载自blog.csdn.net/qq_45161607/article/details/103031380