多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
>[success] # 选择排序法 [不错的文章先读一下](https://juejin.im/post/6844904167778041869#heading-0) ~~~ 1..选择排序大致的思路是找到数据结构中的最小值并 将其放置在第一位,接着找到第二小的值并将其放在第二位 2.可以理解成'选择排序'将整个排序分成两个区间,分别是'排序区间'和'未排序区间',选择排序每次会从'未排序区间'中找到 最小的元素,将其放到已排序区间的末尾。 3.对引用图进行说明一下,引用第一个图中的第二组数据说明 '1 5 6 3 2 4',现在的1就是排序区间,'5 6 3 2 4' 就是为排序区间,这里要说图虽然是 5 和 2 直接交换,但实际末尾的'4' 也是比较过了,只是图上的效果感觉4没有参与本次运算 ~~~ ![](https://box.kancloud.cn/44be35da53ae9ee564ce444542a43d10_811x248.gif) * 这里引用一下王争老师的图 ![](https://img.kancloud.cn/b5/db/b5db03a526081955ca586f004bef05d4_1142x856.png) * js 算法结构的图 ![](https://img.kancloud.cn/6b/73/6b737a79439ad7c8c4cbeda45d3e21e3_409x246.png) >[info] ## 代码实现 * 工具方法 ~~~ // 生成随机数数组 function randomArray(max, min, len) { let randomNum = 0 const array = [] for (let i = 0; i < len; i++) { randomNum = Math.floor((Math.random() * (max - min + 1)) + min) array.push(randomNum) } return array } const array = randomArray(1, 10, 5) const Compare = { LESS_THAN: -1, BIGGER_THAN: 1, EQUALS: 0 }; function defaultCompare(a, b) { if (a === b) { return Compare.EQUALS; } return a < b ? Compare.LESS_THAN : Compare.BIGGER_THAN; } // 交换数组中的位置 function swap(array, a, b) { /* const temp = array[a]; array[a] = array[b]; array[b] = temp; */ [array[a], array[b]] = [array[b], array[a]]; } ~~~ >[danger] ##### 等价替换 ~~~ 1.想写出选择排序,给先知道一个思维逻辑'等价替换',现在有个小的需求,不用Math 方法,只是通过数组循环 来求出数组中最小值。 2.这类的思路就是,默认'某个值为最小值,但实际这个值可能真的就是最小值,也可能不是',我们用这个值依次去和其他 值比较,然后如果有比这个值还要小的值 ,那这个值就成为我们默认最小值。 ~~~ ~~~ // 等价替换法 function getArraryMin(array, compareFn = defaultCompare) { const { length } = array let min = array[0] for (let i = 1; i < length; i++) { // 默认 0 是最小的 if (compareFn(min, array[i]) === Compare.BIGGER_THAN) { min = array[i] } } return min } console.log(array) console.log(Math.min(...array)) console.log(getArraryMin(array)) ~~~ >[danger] ##### 代码实现 ~~~ 1.这里有个思维转换,当我们求一个数组中最小值和最大值的时候,我们用等价替换的方法,只是 循环了一次, 问题来了当我们要把数组中所有的都进行排序那单单的一次循环肯定不够的,这时候就是双层for 循环 2.这里还要注意的是'选择排序'的概念,我们其实会将整个数组分成两个区域,'排序区间'和'未排序区间',其中'排序区间' 是在数组前半部分,因此已经排序过的地方肯定是不需要在进行排序因此第二层的循环条件也变成了'let j = i; j < length; j++' ~~~ ~~~ // 选择排序 function selectionSort(array, compareFn = defaultCompare) { const { length } = array let indexMin for (let i = 0; i < length-1; i++) { // 等价替换 indexMin = i for (let j = i; j < length; j++) { if (compareFn(array[indexMin], array[j]) === Compare.BIGGER_THAN) { indexMin = j } } if (i !== indexMin) { swap(array, i, indexMin) } } return array } console.log(selectionSort(array)) ~~~