排序——排序不是去背代码而是理解思想流程
- 冒泡排序—核心算法:当前元素与他后一个元素进行比较
他的稳定性高
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 我们比较了一次
所以我们可以使用嵌套循环来求解冒泡循环
代码求解如下:
- 选择排序—核心算法:当前数字与后边的每一个数字都要比一下
他的稳定性差
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
求解代码如下:
- 插入排序—核心思想:第一个数字不看,从第二个数字开始看
并不是每个元素和其它元素经行比较,如果左边的数字比当前小,意味着左边的一切都比它小且有序
插入排序的效率高,并且是稳定的。
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.
代码实现如下
- 计数排序 非比较类排序(哈希表的一种应用) 只适用于数字
让数组中的最小值和角标0对应,最大值和数组长度-1对应
数字和角标之间的偏移我们称之为差值
eg:4,3,2,2,1,6,3,7,4,8,4,7,2,3,-2,-3
计数排序的结题思路为:
1.先for循环找到数组中的最大值和最小值
2.确定一个合适的数组区间(哈希表),确定数字与角标之间的偏移量
3.给你建立的哈希数组遍历赋值,然后打印哈希数组
实现代码如下