在对数组内的元素进行从小到大或从大到小排序时,使用数组方法sort可以很简单的实现,但是在面试时,面试官很喜欢对冒泡排序及选择排序进行提问,下面我们来了解一下冒泡排序与选择排序:
冒泡排序
先准备一个乱序的数组:
var arr = [3, 1, 5, 6, 4, 9, 7, 2, 8]
思路
1、先遍历数组,让相邻的两个进行比较,如果前一个比后一个大,那么就把两个换个位置
for (var i = 0; i < arr.length; i++) {
// 判断,如果数组中的当前一个比后一个大,那么两个交换一下位置
if (arr[i] > arr[i + 1]) {
var tmp = arr[i]
arr[i] = arr[i + 1]
arr[i + 1] = tmp
}
}
2、数组遍历一遍以后,那么最后一个数字就是最大的那个了,遍历完毕以后,数组就会变成 [3, 1, 5, 6, 4, 7, 2, 8, 9]
3、然后我们把上面的这段代码执行多次。按照数组的长度来遍历多少次
for (var j = 0; j < arr.length; j++) {
for (var i = 0; i < arr.length; i++) {
// 判断,如果数组中的当前一个比后一个大,那么两个交换一下位置
if (arr[i] > arr[i + 1]) {
var tmp = arr[i]
arr[i] = arr[i + 1]
arr[i + 1] = tmp
}
}
}
4、以此类推,最后就会按照顺序把数组排好了[1,2,3,4,5,6,7,8,9]
代码优化
1、想象一个问题,假设数组长度是 9,第八次排完以后,后面八个数字已经按照顺序排列好了,剩下的那个最小的一定是在最前面,那么第九次就已经没有意义了,因为最小的已经在最前面了,不会再有任何换位置出现了,那么我们第九次遍历就不需要了,所以我们可以减少一次
2、第二个问题,第一次的时候,已经把最大的数字放在最后面了,那么第二次的时候,其实倒数第二个和最后一个就不用比了,因为我们就是要把倒数第二大的放在倒数第二的位置,即使比较了,也不会换位置,第三次就要倒数第三个数字就不用再和后两个比较了,以此类推,那么其实每次遍历的时候,就遍历当前次数 - 1 次
最终代码
var arr = [3, 1, 5, 6, 4, 9, 7, 2, 8]//先准备一个乱序的数组
for (var j = 0; j < arr.length - 1; j++) {
//按照数组长度来进行多次遍历
for (var i = 0; i < arr.length - 1 - j; i++) {
// 判断,如果数组中的当前一个比后一个大,那么两个交换一下位置
if (arr[i] > arr[i + 1]) {
var tmp = arr[i]
arr[i] = arr[i + 1]
arr[i + 1] = tmp
//借助第三个变量tmp,对满足条件的两项调换彼此位置
}
}
}
document.write(arr)//对排序完之后的数组在页面上输出
选择排序
思路
1、先假定数组中的第 0 个就是最小的数字的索引
2、然后遍历数组,只要有一个数字比我小,那么就替换之前记录的索引
3、知道数组遍历结束后,就能找到最小的那个索引,然后让最小的索引换到第 0 个的位置
4、再来第二趟遍历,假定第 1 个是最小的数字的索引
5、在遍历一次数组,找到比我小的那个数字的索引
6、遍历结束后换个位置
7、依次类推,也可以把数组排序好
最终代码
var arr = [3, 1, 5, 6, 4, 9, 7, 2, 8]
for (var j = 0; j < arr.length - 1; j++) {
var minIndex = j
for (var i = j + 1; i < arr.length; i++) {
if (arr[i] < arr[minIndex]) {
minIndex = i
}
}
if (minIndex !== j) {
var tmp = arr[minIndex]
arr[minIndex] = arr[j]
arr[j] = tmp
}
}
document.write(arr)