今天我们简单讲解一下冒泡排序和选择排序的实现。
首先我们需要清楚冒泡排序和选择排序是什么?
排序顾名思义就是把一个乱序的数组,通过我们的处理,让它变成一个有序的数组。
我们先来看一下冒泡排序:
冒泡排序的逻辑:
- 先遍历数组,让挨着的两个进行比较,如果前一个比后一个大(如果前一个比后一个小,也一样,只不过一个是实现从小到大排序,一个是实现从大到小排序),那么就把两个互换位置。
- 数组遍历一遍之后,那么最后一个数字就是最大的那个
- 然后再进行遍历,按照之前的规则,我们知道第二大的数字就会跑到倒数第二的位置。
- 以此类推,最后就会按照顺序把数组排列好了。(仔细思考,我们会发现在后面进行排时,前面已经排好的数字已经不需要再进行比较了)
下来我们开始编写代码:
1.我们先准备一个乱序的数组
2.接下来,我们需要知道两个数怎么互换位置
假设我们现在需要数组的第一位和第二位互换位置,我们需要借助一个中间变量,代码如下:
3.我们的准备工作已经做好了,接下来开始第一次遍历数组
遍历完毕:因为要进行 i + 1 的操作,所以结束条件写成了 i < arr.length - 1
4.接下来我们按照数组的长度进行遍历
这里我们需要注意的是,当我们把数组的数字排列好的只剩一个数字是,那么那个数字就不需要在进行排序,它就是最大的或着最小的。所以我们的外层for循环的结束条件是 j < arr.length - 。
我还需要注意的是,当我们第一次循环了之后,已经把最大的数字排列在最后面,而第二次之后把第二大的数字排列在倒数第二的位置,这样我们再进行排序的时候发现,未排序的数字和排序好的数字就不要再进行比较了,因为即使比较了也不会互换位置,所以我们这里的内部for循环的结束条件就是 i < arr.length - 1 - j。至此一个冒泡排序就结束了,大家快去试一试。
我们再来看一下选择排序:
- 选择排序的逻辑:
- 先假定数组中的第0个就是最小的数字的索引
- 然后遍历数组,只要有一个比我小的数字,那么就替换之间记录的索引
- 遍历数组结束之后就可以找到最小的数的索引,然后将最小的数换到第0个的位置
- 再来一遍遍历,因为第一个位置已经排列好,就假定第二个位置是最小的数,再来一遍找到第二小的数的索引,然后换位置
- 以此类推,就把数组排列好了
1.同样的我们先准备一个乱序的数组
2.假定数组中的第0个(也就是第一个)是最小数,索引就是0
3.遍历数组,判断,只要数字比我小就将其索引赋值给minIndex,遍历完毕后再互换两个数位置
4.同样的按照数组的长度重复执行上面的代码
同样的道理,现在数组的长度是9,我们排列玩8个数字之后,最后一个数就不需要再进行过排序了,所以外层for循环的结束条件是 j < arr.length - 1。我们发现,我们排列第一个数字的时候是假定第一个数字最小索引是0,排列第二个数字的时候,是假定第二个数最小,索引是1,都是和下一个数字比较,所以我们将代码进行了优化如: minIndex = j ,var i = j + 1 , arr[minIndex] = arr[j] , arr[j] = temp 至此一个选择排序就完成了,如下图
大家可以试试用两个排序实现从大到小的排序效果!!!