选择排序,作为经典的排序算法。与冒泡排序一样,在面试中也常常会被问到,如果你没有掌握,那面试也就结束了?
本文采用图文的方式讲解选择排序的特点,分步骤讲解js的实现思路以及相对应的代码,欢迎各位感兴趣的开发者阅读本文?
从待排序的数据中寻找最小值,将其与序列最左边的数字进行交换,重复这一操作的算法即选择排序。
如图所示,将下列数据按照从小到大的顺序进行排列。
接下来,我们用JavaScript根据实现思路来实现下选择排序。
/**
* 1. 从数组的0号元素开始和之后的元素进行大小比较
* 2. 找到最小值后,将最小值与当前比较值进行位置互换
* 3. 重复上述操作,当前轮数则为比较元素的位置,直至最后一轮的比较
*/
const selectSort = function (arr) {
for (let i = 0; i < (arr.length-1); i++){
// 最小值
let min = arr[i];
// 最小值位置
let minIndex = i;
// 比较次数
let round = 0;
for (let j = i+1; j<arr.length; j++){
round ++;
if(min>arr[j]){
// 如果最小值大于当前比较值,则进最小值赋值当前遍历到的值
min = arr[j];
minIndex = j;
}
}
console.log(`第${i+1}轮结束: ${arr},最小值${min},最小值位置${minIndex},共比较${round}次`);
// 位置互换
[arr[i],arr[minIndex]] = [min,arr[i]];
}
return arr;
};
const arrData = [4,6,7,8,9,1,2,3,4];
console.log(selectSort(arrData));
执行结果
从序列左端开始依次对数据进行排序的算法称为插入排序。
如图所示,对下列数据进行排序
接下来,我们用JavaScript根据实现思路来实现下插入排序。
/*
* 1. 已排序区域的默认值为数组的0号元素
* 2. 未排序区域为数组的1号元素至数组的末尾
* 3. 给已排序区域新增未排序区域最左侧的值
* 4. 反向遍历已排序区域的数据
* 5. 将新插入的数据和当前遍历到的数据进行大小比较
* 6. 如果新插入的数据小于当前遍历到的数据则交换位置
* */
const insertSort = function (arr) {
// 未排序区域
let unsortedArea = arr;
// 已排序区域
let sortedArea = [arr[0]];
for (let i = 1; i < unsortedArea.length; i++){
// 已排序区域新增当前未排序区域最左侧的值
sortedArea.push(unsortedArea[i]);
// 反向遍历已排序区域的值,将已排序区域的值进行排序
for(let j = sortedArea.length - 2; j >= 0; j--){
// 当前插入值在已排序区域的位置
let insertIndex = sortedArea.getArrayIndex(unsortedArea[i]);
// 对已排序区域新插入进来的值与当前循环到的元素进行大小判断
if( unsortedArea[i] < sortedArea[j]){
[sortedArea[insertIndex],sortedArea[j]] = [sortedArea[j],sortedArea[insertIndex]];
}
}
}
return sortedArea;
};
// 原型添加查找索引函数
Array.prototype.getArrayIndex = function (obj) {
for(let i = 0;i < this.length;i++){
if(this[i]===obj){
return i;
}
}
return -1;
};
const arrData = [5,8,9,2,3,6,1,0,7];
console.log(insertSort(arrData));
执行结果
上述代码执行完成后,没有问题,正确排序了,但是我换了数据后上述代码就无法正常工作了。
const arrData = [5,8,9,2,3,6,1,0,7,7,7,7];
console.log(insertSort(arrData));
感谢评论区 @_Dreams 的指正,我才发现了自己代码的错误,正确的代码如下所示:
const insertSortOther = function (arr) {
const len = arr.length;
for (let i = 1; i < len; i++) {
let temp = arr[i];
// 默认已排序的元素
let j = i - 1;
// 在已排序好的队列中从后向前扫描
while (j >= 0 && arr[j] > temp) {
// 已排序的元素大于新元素,将该元素移到一下个位置
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = temp;
}
return arr;
}
测试下上述代码是否正确执行
const data = [5,8,9,2,3,6,1,0,7,7,7,7];
console.log(insertSortOther(data))
* 文中使用的图片源自《我的第一本算法书》,如若侵权,请联系图雀社区公众号小编,作者立即删除相关图片。
* 文中如有错误,欢迎在关注公众号加群交流,如果这篇文章帮到了你,欢迎点个在看和关注?
● 前端学习数据结构与算法系列(一):初识数据结构与算法● 前端学习数据结构与算法系列(二):链表与数组的基础知识● 前端学习数据结构与算法系列(四):哈希、堆和二叉查找树
·END·