排序
1.冒泡排序
let arr = [1,3,4,2,7,5,6,8]
function bubleSort(arr) {
var len = arr.length;
for (let outer = len ; outer >= 2; outer--) {
for(let inner = 0; inner <=outer - 1; inner++) {
console.log("outer:"+outer)
console.log("inner:"+inner)
if(arr[inner] > arr[inner + 1]) {
[arr[inner+1],arr[inner]] = [arr[inner],arr[inner+1]]
}
}
}
return arr;
}
bubleSort(arr)
console.log(arr)
复制代码
关于冒泡排序有个细节就是,即使是数组已经完成排序,循环也不会停止。 打印出来的outer
和inner
如图所示:
let arr = [1,3,4,2,7,5,6,8]
function bubleSort(arr) {
var len = arr.length;
for (let outer = len ; outer >= 2; outer--) {
let completeSort = true
for(let inner = 0; inner <=outer - 1; inner++) {
console.log("outer:"+outer)
console.log("inner:"+inner)
if(arr[inner] > arr[inner + 1]) {
[arr[inner+1],arr[inner]] = [arr[inner],arr[inner+1]]
completeSort = false
}
}
if(completeSort){
break
}
}
return arr;
}
bubleSort(arr)
console.log(arr)//[1,2,3,4,5,6,7,8]
复制代码
我们依然打印出outer
和inner
:
outer=6
之时,数组已经完成了排序。
2.选择排序
let arr = [1,3,4,2,7,5,6,8]
function selectSort(arr) {
var len = arr.length;
for(let pos = 0 ;pos < len - 1; pos++) {
for(let cur = pos ; cur<len; cur++) {
if(arr[cur] < arr[pos]) {
[arr[cur],arr[pos]] = [arr[pos],arr[cur]];
}
}
}
return arr
}
selectSort(arr)
console.log(arr)
复制代码
选择排序实现思路就是依次将数组的每一项元素都与所有其他元素比较大小,而后依照排列规则调换位置。
3.插入排序
let arr = [1,3,4,2,7,5,6,8]
function insertSort(arr) {
for(let i = 1; i < arr.length; i++) {
for(let j = i; j > 0; j--) {
if(arr[j] < arr[j-1]) {
[arr[j],arr[j-1]] = [arr[j-1],arr[j]];
console.log(arr)
} else {
break;
}
}
}
return arr;
}
insertSort(arr)
复制代码
插入排序就是默认arr[0]
这一段是有序的(只有一个元素当然是有序的咯),然后往这个有序片段里面插入元素,插入的方法是将无序片段(也就是首项之后的所有元素的片段)的每一项与有序片段里的每一段对比,按照规则将无序片段中的元素插入到有序片段中,从始至终保证有序片段的“纯净”。因为是与有序片段对比,所以如果与有序末尾的最后一个元素对比结果是不进入if
的话,那后面也没需要对比,可以直接break
了,这是需要注意的地方。
*快速排序
function quickSort(arr) {
debugger
if(arr.length <= 1) {
return arr //递归出口
}
var left = [],
right = [],
current = arr.splice(0,1); //注意splice后,数组长度少了一个
for(let i = 0; i < arr.length; i++) {
if(arr[i] < current) {
left.push(arr[i]) //放在左边
} else {
right.push(arr[i]) //放在右边
}
}
return quickSort(left).concat(current,quickSort(right)); //递归
}
复制代码
如代码所示,快速排序就是将每个元素与一个基准元素比较大小,然后按照规则判断这个元素是放在这个基准的左边还是右边,重复执行就可以得到一个有序的数组了。比如说一群人按身高来列队,我们将没有列好的队伍中选出一个人出列,作为基准,然后让所有身高比他高的站他右边,比他矮的站他左边。但是这样只操作一次肯定是得不到一个整齐的队伍的,所以我们还要对基准左右两边的人再进行这个操作。
至于为什么是current = arr.splice(0,1)
,是因为当最后left
或者right
中只剩余2
个元素的时候,这两个元素间依然是要排序的,所以为了保证取到current
,就必须是splice(0,1)
或者splice(1,1)
,是不可随机选择的。