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