常用的排序算法
- 冒泡排序O(n^2)
- 选择排序O(n^2)
- 插入排序O(n^2)
- 快速排序O(nlogn)
- 归并排序O(nlogn)
以下我们用Javascript语言来实现上面的算法
冒泡排序
function bubbleSort(arr) {
var length = arr.length;
for (var i = 0; i < length; i++) {
for (var j = 0; j < length - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
var temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
return arr;
}
console.log('冒泡排序O(n^2) ', bubbleSort([7, 5, 6, 1, 2, 3, 4]))
// [1,2,3,4,5,6,7]
例子:
第1步:[7, 5, 6, 1, 2, 3, 4] => [5, 7, 6, 1, 2, 3, 4]
第2步: => [5, 6, 7, 1, 2, 3, 4]
第3步: => [5, 6, 1, 7, 2, 3, 4]
第4步: => [5, 6, 1, 2, 7, 3, 4]
第5步: => [5, 6, 1, 2, 3, 7, 4]
第6步: => [5, 6, 1, 2, 3, 4, 7]
最后一个值为最大值7,然后遍历 [5, 6, 1, 2, 3, 4] 寻找第二大值放置7前面,以此类推,重复以上步骤,完成排序。
选择排序
function selectionSort(arr) {
var length = arr.length;
for (var i = 0; i < length; i++) {
for (var j = i + 1; j < length; j++) {
if (arr[i] > arr[j]) {
var temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
return arr;
}
console.log('选择排序O(n^2) ', selectionSort([7, 5, 6, 1, 2, 3, 4]))
// [1,2,3,4,5,6,7]
例子:
第1步:[7, 5, 6, 1, 2, 3, 4] => [5, 7, 6, 1, 2, 3, 4]
第2步: => [5, 7, 6, 1, 2, 3, 4]
第3步: => [1, 7, 6, 5, 2, 3, 4]
第4步: => [1, 7, 6, 5, 2, 3, 4]
第5步: => [1, 7, 6, 5, 2, 3, 4]
第6步: => [1, 7, 6, 5, 2, 3, 4]
红色表示每次比较的值,如果前面的大于后面的就进行交换。
插入排序
function insertSort(arr) {
var length = arr.length;
for (var i = 1; i < length; i++) {
for (var j = 0; j < i; j++) {
if (arr[i] < arr[j]) {
var temp = arr.splice(i, 1)[0];
arr.splice(j, 0, temp);
break;
}
}
}
return arr;
}
console.log('插入排序O(n^2) ', insertSort([7, 5, 6, 1, 2, 3, 4]))
// [1,2,3,4,5,6,7]
快速排序
function quickSort(arr) {
var length = arr.length;
function dfs(left, right) {
var x = left, y = right;
var dir = true; // true: right--; false: left++;
var current = arr[left]; // 当前值,左边小,右边大
while (left < right) {
if (dir) {
if (current > arr[right]) {
arr[left] = arr[right];
dir = false;
}
} else {
if (current < arr[left]) {
arr[right] = arr[left];
dir = true;
}
}
if (dir) {
right--;
} else {
left++;
}
}
arr[left] = current;
if (left - x >= 2) {
dfs(x, left - 1);
}
if (y - left >= 2) {
dfs(left + 1, y);
}
}
dfs(0, length - 1);
return arr;
}
console.log('快速排序O(nlogn) ', quickSort([4, 5, 6, 1, 2, 3, 7]))
归并排序
function mergeSort(arr) {
function mergeArr(i, j, a, b, array) {
var temp = [];
while (i <= j && a <= b) {
if (array[i] < array[a]) {
temp.push(array[i]);
i++;
} else {
temp.push(array[a]);
a++;
}
}
if (i > j) {
temp = temp.concat(array.slice(a, b + 1));
} else {
temp = temp.concat(array.slice(i, j + 1));
}
return temp;
}
//
function dfs(i, j) {
if (i === j) {
return { left: i, right: j }
}
if (j - i === 1) {
if (arr[i] > arr[j]) {
var temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
return { left: i, right: j };
}
var mid = parseInt((i + j) / 2);
var s1 = dfs(i, mid);
var s2 = dfs(mid + 1, j);
// 分治
if (s1 && s2) {
var temp = mergeArr(s1.left, s1.right, s2.left, s2.right, arr);
Array.prototype.splice.apply(arr, [s1.left, s2.right - s1.left + 1].concat(temp));
return { left: s1.left, right: s2.right }
}
}
dfs(0, arr.length - 1);
return arr;
}
console.log('归并排序O(nlogn)', mergeSort([4, 5, 6, 1, 2, 3, 7]))