基础排序算法
选择排序
选择一个基准值,通过遍历比出最小的和基准值替换
选择一个基准索引,比如0,然后让后面的值一次和这个0索引的值比较,比他小(大)就两个值交换,比完一轮之后基准索引+1。两轮循环,外层从i=0开始,内层从i+1开始.
let arr = [12, 34, 30, 20, 4, 56]
let targetIndex = 0
for(let i = 1; i < arr.length; i++){
for (let j = i; j < arr.length; j++) {
if (arr[j] <= arr[targetIndex]) {
let temp = arr[targetIndex]
arr[targetIndex] = arr[j]
arr[j] = temp
}
}
targetIndex++
}
console.log(arr)
冒泡排序
选择从左或者从右开始比较,从左选择第一个值,一次和后面每一个值进行比较,只要比它小的就交换位置,直到最后一个值为止。两轮循环,外层从i=0开始,内层从i+1开始
let arr = [12, 34, 30, 20, 4, 56]
for(let i = 0; i < arr.length; i++) {
for (let j = i+1; j < arr.length; j++) {
if (arr[i] >= arr[j]) {
let temp = arr[j]
arr[j] = arr[i]
arr[i] = temp
}
}
}
console.log(arr)
插入排序
插入排序是把需要排序的数组分成两部分,第一部分是已排好的顺序,默认从第一个值开始架设他已排好顺序,后面这个第一部分的数组会越来越多,从小到大。每次拿新的目标值先和第一部分最大值进行比较,比最大值大就位置不变进行下一个目标值,比最大值小就从大到小比过去位置后移一个直到插入到正确位置。外层循环从1开始 内层可以用while判断目标值和第一部分最大值的大小关系决定是否继续往前比较,最后把目标值放到指定位置
let arr = [12,13,11,4,34,454,21,22,421,42,44,55,2212]
for (let i = 1; i < arr.length; i++) {
let preIndex = i - 1
let current = arr[i] // 数组的某一个值不是数组类型不存在引用
while(preIndex >= 0 && current < arr[preIndex] ) {
arr[preIndex + 1] = arr[preIndex]
preIndex --
console.log(current)
}
arr[preIndex + 1] = current
}
快速排序
- 快排的原理如下。随机选取一个数组中的值作为基准值,从左至右取值与基准值对比大小。比基准值小的放数组左边,大的放右边,
- 对比完成后将基准值和第一个比基准值大的值交换位置。然后将数组以基准值的位置分为两部分,继续递归以上操作。
需要递归,选中间值,有左右数组变量
var quickSort = function(arr) {
if (arr.length <= 1) {
return arr;
}
var pivotIndex = Math.floor(arr.length / 2);
var pivot = arr.splice(pivotIndex, 1)[0];
var left = [];
var right = [];
for (var i = 0; i < arr.length; i++) {
if (arr[i] < pivot) {
left.push(arr[i]);
} else {
right.push(arr[i]);
}
}
return quickSort(left).concat([pivot], quickSort(right));
};
归并排序
将数组分为两部分,再把两部分再分为两部分,知道分为一个单元数组,在组合的时候两两进行有序组合 最后组合成有序数组
总结一下:
常用排序方法
选冒快插归
- 选择和冒泡排序都是两层遍历,选择比冒牌多了个基准值,基准值索引得累加。
- 快速排序是选一个中间值分成两个数组,返回return quickSort(left).concat([pivot], quickSort(right))
- 插入排序顾名思义就是插入,默认找出一个有序数组[index = 0],然后拿后面的值和有序数组中的每个值比较(从右往左,由大到小),找到了合适的位置就插入,用for嵌套一个while循环。插入的本质其实也是交换值有序数组增大一位
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。