幾種簡單的排序演算法
阿新 • • 發佈:2018-11-08
1.向上氣泡排序
var len = arr.length;
for (var i = 0; i < len - 1; i++) { //比較趟數;
for (var j = len - 1; j > i; j--) { //比較次數
if (arr[j] > arr[j - 1]) { //降序
[arr[j], arr[j - 1]] = [arr[j - 1], arr[j]];
}
}
}
2.選擇排序
未排序部分是整個陣列, 已排序部分是空的 找最值(最大或最小)
var len = arr.length; for(let i = 0; i < len - 1; i++) { let minIndex = i; for (let j = i + 1; j < len; j++) { if (arr[j] < arr[minIndex]) { minIndex = j; //先和一個基值比較,找到最大或最小值後存其索引; } } [arr[i], arr[minIndex]] = [arr[minIndex], arr[i]] }
3.插入排序
已排序部分:視為有一個初始值,
未排序部分:依次從裡面取值到已排序部分,進行從後向前的比較,如果已排序部分大於待排序部分
繼續向前,值到已排序部分有第一個比他小的數,就把待排序數插入到這個值後面。
for (var i = 1; i < len; i++) { //迴圈待排序部分 var c = arr[i]; //存待排序值 // for (var j = i - 1; j >= 0; j--) {//與已排序部分進行比較 // if (arr[j] > c) { // arr[j + 1] = arr[j]; // } else { // break; // } // } // console.log(j) // arr[j + 1] = c; var j = i - 1; while (j >= 0 && arr[j] < c) { arr[j + 1] = arr[j] j--; } arr[j + 1] = c; } console.log(arr);
4.快速排序
function quickSort(arr) { //如果陣列<=1,則直接返回 if (arr.length <= 1) { return arr; } var pivotIndex = Math.floor(arr.length / 2); //找基準,並把基準從原陣列刪除 var pivot = arr.splice(pivotIndex, 1)[0]; //定義左右陣列 var left = []; var right = []; //比基準小的放在left,比基準大的放在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)); } quickSort(arr); console.log(arr);
5.隨機排序
arr.sort(() => Math.random() - 0.5)
6.利用洗牌演算法寫隨機排序
var arr = [10, 2, 8, 36, 17, 11, 9];
var len = arr.length;
var random = ([x, y], z) => {
let data = Math.floor(Math.random() * (y - x) + x);
return data === z ? random([x, y], z) : data;
}
let leng = len - 1;
for (let i = 0; i < len * 2; i++) {
let _i = i % len;
//正向排序
let r = random([0, leng], _i);
[arr[_i], arr[r]] = [arr[r], arr[_i]];
//反向排序
r = random([0, leng], _i);
[arr[leng - _i], arr[r]] = [arr[r], arr[leng - _i]]
}
console.log(arr)