Javascript 排序(转)

Javascript Sort

之前看到有一个例子演示排序的一系列算法,在Javascript中怎么实现呢?

1.合并排序
算法核心是将一堆数组中前后相邻的两个有序序列合并成一个有序序列,采用递归来实现,先进行划分,再进行合并。

function merge(left, right) {
var result = [];
while (left.length > 0 && right.length > 0) {
if (left[0] < right[0]) {
result.push(left.shift());
} else {
result.push(right.shift());
}
}

return result.concat(left).concat(right);
}
function mergeSort(arr) {
if (arr.length <= 1) {
return arr;
}
var middle = Math.floor(arr.length / 2);
var left = arr.slice(0, middle);
var right = arr.slice(middle);

return merge(mergeSort(left), mergeSort(right));
}

2. 快速排序
算法核心是先在数组中选择一个枢纽值,然后将比这个枢纽值小的元素移到左边,大于枢纽值的元素移到后边,对枢纽两边的值递归进行这么操作直至只有一个元素。

function quickSort(arr) {
if (arr.length <= 1) {
return arr;
}
var pivot = arr.splice(Math.floor(arr.length / 2), 1)[0];
var left = [];
var 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));
}

3. 冒泡排序
算法核心是从上往下扫描数组,比较相邻两个元素,大的在数组的后面,小的在前面,如果不符合则交换二者位置。

function bubbleSort(arr) {
if (arr.length <= 1) {
return arr;
}
for (var i = arr.length - 1; i > 0; i--) {
for (var j = i; j >= 0; j--) {
if (arr[j] < arr[j - 1]) {
var tmp = arr[j];
arr[j] = arr[j - 1];
arr[j - 1] = tmp;
}
}
}

return arr;
}

4. 选择排序
算法核心是首先在未排序序列中找到最小元素,放在排序序列的起始位置,再从未排序序列中找到最小元素放到排序序列末尾位置。

function selectSort(arr) {
var min, tmp;
for (var i = 0; i < arr.length; i++) {
min = i;
for (var j = i + 1; j < arr.length; j++) {
if (arr[min] > arr[j]) {
min = j;
}
}
if (min != i) {
tmp = arr[i];
arr[i] = arr[min];
arr[min] = tmp;
}
}

return arr;
}

5. 插入排序
算法核心是每次从无序列表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序。

function insertSort(arr) {
for (var i = 1; i < arr.length; i++) {
var tmp = arr[i],
j = i;
while (arr[j - 1] > tmp) {
arr[j] = arr[j - 1];
--j;
}
arr[j] = tmp;
}

return arr;
}
};

6. 数组的原生Sort方法
在sort内传入对比function就可以

arr.sort(function(a, b) {
return a - b;
});

上面这几种排序方法性能如下(数据量比较小的情况下),测试地址:http://jsperf.com/javascript-sort

posted @ 2012-10-15 10:00  susubanana  阅读(166)  评论(0编辑  收藏  举报