工作中經常用到的幾種排序方式,整理出來分享給大家以備不時之需。
1、array排序函數sort
使用Array的sort方法。
var arr = [2, 8, 5, 0, 5, 2, 6, 7, 2]
arr.sort((a,b) => {
return a - b
})
console.log(arr) // 結果:[0, 2, 2, 2, 5, 5, 6, 7, 8]
2、冒泡排序
将數組中的相鄰兩個元素進行比較,将比較大(較小)的數通過兩兩比較移動到數組末尾(開始),執行一遍内層循環,确定一個最大(最小)的數,外層循環從數組末尾(開始)周遊到開始(末尾)。
var arr = [2, 8, 5, 0, 5, 2, 6, 7, 2]
for(var i=0;i<arr.length;i++) {
for(var j=0;j<arr.length-1;j++) {
if (arr[j]>arr[j+1]) {
let news = arr[j]
arr[j] = arr[j+1]
arr[j+1] = news
}
}
}
console.log(arr)
// 結果:[0, 2, 2, 2, 5, 5, 6, 7, 8]
3、選擇排序
首先從原始數組中找到最小的元素,并把該元素放在數組的最前面,然後再從剩下的元素中尋找最小的元素,放在之前最小元素的後面,minIndex始終儲存着最小值的位置的索引,随着i的自增,周遊的數組長度越來越短,直到完成排序。
var arr = [2, 8, 5, 0, 5, 2, 6, 7, 2]
for(var i=0;i<arr.length;i++) {
var minIndex=i;
for(var j=i+1;j<arr.length;j++) {
if(arr[j]<arr[minIndex]){
minIndex=j
}
}
if(minIndex!=i){
var news = arr[i];
arr[i]=arr[minIndex]
arr[minIndex]=news
}
}
console.log(arr) // 結果:[0, 2, 2, 2, 5, 5, 6, 7, 8]
4、插入排序
var arr = [2, 8, 5, 0, 5, 2, 6, 7, 2]
//假設第0個元素是一個有序的數列,第1個以後的是無序的序列,
//是以從第1個元素開始将無序數列的元素插入到有序數列中
for(var i = 1; i < arr.length; i++){
//升序
if(arr[i] < arr[i-1]){
//取出無序數列中的第i個作為被插入元素
var guard = arr[i];
//記住有序數列的最後一個位置,并且将有序數列位置擴大一個
var j = i - 1;
arr[i] = arr[j];
//比大小,找到被插入元素所在的位置
while(j >= 0 && guard < arr[j]){
arr[j+1] = arr[j];
j--;
}
//插入
arr[j+1] = guard;
}
}
console.log(arr) // 結果:[0, 2, 2, 2, 5, 5, 6, 7, 8]
5、快速排序
快速排序涉及到了遞歸,将一個數組的排序問題看成是兩個小數組的排序問題,而每個小的數組又可以繼續看成更小的兩個數組,一直遞歸下去,直到數組長度大小最大為2。
var arr = [2, 8, 5, 0, 5, 2, 6, 7, 2]
function quickSort(arr){
if(arr.length<=1){//如果數組隻有一個數,就直接傳回;
return arr;
}
var num=Math.floor(arr.length/2);//找到中間數的索引值,如果是浮點數,則向下取整
var newValue=arr.splice(num,1);//找到中間數的值
var left=[],right=[];
for(var i=0;i<arr.length;i++){
if(arr[i]<newValue){
left.push(arr[i]);//基準點的左邊的數傳到左邊數組
}else{
right.push(arr[i]);//基準點的右邊的數傳到右邊數組
}
}
return quickSort(left).concat(newValue,quickSort(right));//遞歸不斷重複比較
}
console.log(quickSort(arr))
// 結果:[0, 2, 2, 2, 5, 5, 6, 7, 8]