JS三种排序方法
前提
假如我们有一个数组 数组的长度为
n
,我们需要将一个数据插入到数据的第k
个位置,则需要将 k 到 n 位元素都顺序地往后挪动一位。而排序 则需要重复的调用这一操作
这无疑是很麻烦 而且费时间 和算力的。
尽量少的执行插入能提升性能和速度
数组又是很底层的东西 会需要大量的操作 所以如何快速 又有效的排序就成为了一个问题
冒泡
最原始的方法 也最容易理解 但也是最耗费效率的 一般正式开发中极少有用到 但作为最初始的方法 也应理解
简单的解释就是 不断对比两个相邻的值 将其中大的一个 放在后面 //当然如果你愿意的话 也可以将小的放在后面
最大的值 无论和谁比都是大的 就会一直被放在后面 一路被放到最后
所以执行完一轮以后 最大 的 必然 被放在最后一位 , 必然
然后去执行第二轮 重复上面的操作 会将第二大的值 放在倒数第二位
以此往复 到最后一个的时候 数组就排完了
var arr = [23,13, 23, 1, 12, 45, 37, 98, 20, 14, 17, 58, 36, 47, 76]
for (var i = 0; i < arr.length; i++) {
for (var j = 0; j < arr.length; j++) {
if (arr[j] > arr[j + 1]) {
var temp = arr[j]
arr[j] = arr[j + 1]
arr[j + 1] = temp
console.log(arr)
}
}
console.log("=======")
}
(15) [13, 23, 23, 1, 12, 45, 37, 98, 20, 14, 17, 58, 36, 47, 76] //此行将13 和23 调换位置
(15) [13, 23, 1, 23, 12, 45, 37, 98, 20, 14, 17, 58, 36, 47, 76]//此行将1 和23 调换位置
(15) [13, 23, 1, 12, 23, 45, 37, 98, 20, 14, 17, 58, 36, 47, 76]//此行将23 和12 调换位置
(15) [13, 23, 1, 12, 23, 37, 45, 98, 20, 14, 17, 58, 36, 47, 76]//此行将37 和45 调换位置
(15) [13, 23, 1, 12, 23, 37, 45, 20, 98, 14, 17, 58, 36, 47, 76]//此行将20 和98 调换位置
(15) [13, 23, 1, 12, 23, 37, 45, 20, 14, 98, 17, 58, 36, 47, 76]//此行将14 和98 调换位置
(15) [13, 23, 1, 12, 23, 37, 45, 20, 14, 17, 98, 58, 36, 47, 76]//此行将17 和98 调换位置
(15) [13, 23, 1, 12, 23, 37, 45, 20, 14, 17, 58, 98, 36, 47, 76]//此行将58 和98 调换位置
(15) [13, 23, 1, 12, 23, 37, 45, 20, 14, 17, 58, 36, 98, 47, 76]//此行将36 和98 调换位置
(15) [13, 23, 1, 12, 23, 37, 45, 20, 14, 17, 58, 36, 47, 98, 76]//此行将47 和98 调换位置
(15) [13, 23, 1, 12, 23, 37, 45, 20, 14, 17, 58, 36, 47, 76, 98]//此行将76 和98 调换位置
======= //第一轮结束 98 被调换到了最后
(15) [13, 1, 23, 12, 23, 37, 45, 20, 14, 17, 58, 36, 47, 76, 98]
(15) [13, 1, 12, 23, 23, 37, 45, 20, 14, 17, 58, 36, 47, 76, 98]
(15) [13, 1, 12, 23, 23, 37, 20, 45, 14, 17, 58, 36, 47, 76, 98]
(15) [13, 1, 12, 23, 23, 37, 20, 14, 45, 17, 58, 36, 47, 76, 98]
(15) [13, 1, 12, 23, 23, 37, 20, 14, 17, 45, 58, 36, 47, 76, 98]
(15) [13, 1, 12, 23, 23, 37, 20, 14, 17, 45, 36, 58, 47, 76, 98]
(15) [13, 1, 12, 23, 23, 37, 20, 14, 17, 45, 36, 47, 58, 76, 98]
=======
(15) [1, 13, 12, 23, 23, 37, 20, 14, 17, 45, 36, 47, 58, 76, 98]
(15) [1, 12, 13, 23, 23, 37, 20, 14, 17, 45, 36, 47, 58, 76, 98]
(15) [1, 12, 13, 23, 23, 20, 37, 14, 17, 45, 36, 47, 58, 76, 98]
(15) [1, 12, 13, 23, 23, 20, 14, 37, 17, 45, 36, 47, 58, 76, 98]
(15) [1, 12, 13, 23, 23, 20, 14, 17, 37, 45, 36, 47, 58, 76, 98]
(15) [1, 12, 13, 23, 23, 20, 14, 17, 37, 36, 45, 47, 58, 76, 98]
=======
(15) [1, 12, 13, 23, 20, 23, 14, 17, 37, 36, 45, 47, 58, 76, 98]
(15) [1, 12, 13, 23, 20, 14, 23, 17, 37, 36, 45, 47, 58, 76, 98]
(15) [1, 12, 13, 23, 20, 14, 17, 23, 37, 36, 45, 47, 58, 76, 98]
(15) [1, 12, 13, 23, 20, 14, 17, 23, 36, 37, 45, 47, 58, 76, 98]
=======
(15) [1, 12, 13, 20, 23, 14, 17, 23, 36, 37, 45, 47, 58, 76, 98]
(15) [1, 12, 13, 20, 14, 23, 17, 23, 36, 37, 45, 47, 58, 76, 98]
(15) [1, 12, 13, 20, 14, 17, 23, 23, 36, 37, 45, 47, 58, 76, 98]
=======
(15) [1, 12, 13, 14, 20, 17, 23, 23, 36, 37, 45, 47, 58, 76, 98]
(15) [1, 12, 13, 14, 17, 20, 23, 23, 36, 37, 45, 47, 58, 76, 98]
10 =======
但此方法 调换次数过多,无用功过多 因为并不实用 此图引用于https://www.jianshu.com/p/ad45b42cc567
选择排序
相比于冒泡 选择就显得聪明的多了
简单的说是 以对比然后交换索引的方法 代替 冒泡的直接交换位置
首先让索引指向第一个数 然后让索引去冒泡 两两对比然后存储最小值的索引 //当然 你乐意的话也可以存大的
然后交换 初始位置 和 指向位置 的两个值
这样 每轮只有一次交换位置 大大节省了算力
var arr = [23, 13, 23, 1, 12, 45, 37, 98, 20, 14, 17, 58, 36, 47, 76]
function Sort(arr) {
var len = arr.length;
var minIndex, temp;
for (var i = 0; i < len - 1; i++) {
minIndex = i;
for (var j = i + 1; j < len; j++) {
if (arr[j] < arr[minIndex]) { // 指针找最小数并且保存
minIndex = j;
}
}
temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = temp; //交换位置
console.log(arr)
}
return arr;
}
Sort(arr)
========结果为=======
(15) [1, 13, 23, 23, 12, 45, 37, 98, 20, 14, 17, 58, 36, 47, 76]
(15) [1, 12, 23, 23, 13, 45, 37, 98, 20, 14, 17, 58, 36, 47, 76]
(15) [1, 12, 13, 23, 23, 45, 37, 98, 20, 14, 17, 58, 36, 47, 76]
(15) [1, 12, 13, 14, 23, 45, 37, 98, 20, 23, 17, 58, 36, 47, 76]
(15) [1, 12, 13, 14, 17, 45, 37, 98, 20, 23, 23, 58, 36, 47, 76]
(15) [1, 12, 13, 14, 17, 20, 37, 98, 45, 23, 23, 58, 36, 47, 76]
(15) [1, 12, 13, 14, 17, 20, 23, 98, 45, 37, 23, 58, 36, 47, 76]
(15) [1, 12, 13, 14, 17, 20, 23, 23, 45, 37, 98, 58, 36, 47, 76]
(15) [1, 12, 13, 14, 17, 20, 23, 23, 36, 37, 98, 58, 45, 47, 76]
(15) [1, 12, 13, 14, 17, 20, 23, 23, 36, 37, 98, 58, 45, 47, 76]
(15) [1, 12, 13, 14, 17, 20, 23, 23, 36, 37, 45, 58, 98, 47, 76]
(15) [1, 12, 13, 14, 17, 20, 23, 23, 36, 37, 45, 47, 98, 58, 76]
(15) [1, 12, 13, 14, 17, 20, 23, 23, 36, 37, 45, 47, 58, 98, 76]
(15) [1, 12, 13, 14, 17, 20, 23, 23, 36, 37, 45, 47, 58, 76, 98]
此图引用于https://www.jianshu.com/p/ad45b42cc567
插入排序
插入排序的原理 是让值 和前面的每一个值进行对比
拿第6个值举例子
让第6个值先与第5个对比 如果第5个大 就再与第4个比 如果第4个大就再与第3个比
如果! 第三小的话 就把第6个放在第三个后面
=======以上 看起来好像不一定管用===但是要注意 正常的程序一定是从 第一个值开始的 然后第二个第三个 这样才能保证 第一位绝对是最小的 第二位是第二小的=====
var arr = [23, 13, 23, 1, 12, 45, 37, 98, 20, 14, 17, 58, 36, 47, 76]
function Sort(arr) {
var len = arr.length;
var index, cnt;
for (var i = 1; i < len; i++) {
index = i - 1;
cnt = arr[i];
while (index >= 0 && arr[index] > cnt) {
arr[index + 1] = arr[index];
index--;
}
arr[index + 1] = cnt;
console.log(arr)
}
return arr;
}
Sort(arr)
========结果为======
(15) [13, 23, 23, 1, 12, 45, 37, 98, 20, 14, 17, 58, 36, 47, 76]
(15) [13, 23, 23, 1, 12, 45, 37, 98, 20, 14, 17, 58, 36, 47, 76]
(15) [1, 13, 23, 23, 12, 45, 37, 98, 20, 14, 17, 58, 36, 47, 76]
(15) [1, 12, 13, 23, 23, 45, 37, 98, 20, 14, 17, 58, 36, 47, 76]
(15) [1, 12, 13, 23, 23, 45, 37, 98, 20, 14, 17, 58, 36, 47, 76]
(15) [1, 12, 13, 23, 23, 37, 45, 98, 20, 14, 17, 58, 36, 47, 76]
(15) [1, 12, 13, 23, 23, 37, 45, 98, 20, 14, 17, 58, 36, 47, 76]
(15) [1, 12, 13, 20, 23, 23, 37, 45, 98, 14, 17, 58, 36, 47, 76]
(15) [1, 12, 13, 14, 20, 23, 23, 37, 45, 98, 17, 58, 36, 47, 76]
(15) [1, 12, 13, 14, 17, 20, 23, 23, 37, 45, 98, 58, 36, 47, 76]
(15) [1, 12, 13, 14, 17, 20, 23, 23, 37, 45, 58, 98, 36, 47, 76]
(15) [1, 12, 13, 14, 17, 20, 23, 23, 36, 37, 45, 58, 98, 47, 76]
(15) [1, 12, 13, 14, 17, 20, 23, 23, 36, 37, 45, 47, 58, 98, 76]
(15) [1, 12, 13, 14, 17, 20, 23, 23, 36, 37, 45, 47, 58, 76, 98]
此图引用于https://www.jianshu.com/p/ad45b42cc567