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
:bash
outer=6
之时,数组已经完成了排序。
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)
复制代码
选择排序实现思路就是依次将数组的每一项元素都与全部其余元素比较大小,然后依照排列规则调换位置。优化
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
了,这是须要注意的地方。ui
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)); //递归
}
复制代码
如代码所示,快速排序就是将每一个元素与一个基准元素比较大小,而后按照规则判断这个元素是放在这个基准的左边仍是右边,重复执行就能够获得一个有序的数组了。好比说一群人按身高来列队,咱们将没有列好的队伍中选出一我的出列,做为基准,而后让全部身高比他高的站他右边,比他矮的站他左边。可是这样只操做一次确定是得不到一个整齐的队伍的,因此咱们还要对基准左右两边的人再进行这个操做。spa
至于为何是current = arr.splice(0,1)
,是由于当最后left
或者right
中只剩余2
个元素的时候,这两个元素间依然是要排序的,因此为了保证取到current
,就必须是splice(0,1)
或者splice(1,1)
,是不可随机选择的。debug