您的位置:首页 > Web前端 > JavaScript

JavaScript 基础(006_排序算法)

2016-09-27 20:56 232 查看
排序算法:最近在浏览技术博客的时候无意中发现了一篇关于排序算法的文章,个人觉得总结的非常好,本人是计算机专业的人,看完之后,在觉得汗颜的同时也是受益良多,作为程序员,多积累是个好习惯。自己动手写一写,加深理解,顺便把好文章分享一下。(本文只是用 js 写了各种排序算法的实现,至于各种排序算法的优劣、怎样在不同场合选择最佳的排序算法,这里就不班门弄斧,网上有很多资料,或者查百度百科。)

JS家的排序算法(郑重声明,转载):http://www.jianshu.com/p/1b4068ccd505

冒泡排序:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Bubble Sort</title>
<script type="text/javascript">
var arr = [3, 2, 4, 9, 1, 5, 7, 6, 8];
console.log(bubbleSort(arr));
function bubbleSort(arr) {
var i = arr.length;
while (i > 0) {
for (let j = 0; j < i - 1; j++) {
if (arr[j] > arr[j + 1]) {
arr[j] = arr[j] + arr[j + 1];
arr[j + 1] = arr[j] - arr[j + 1];
arr[j] = arr[j] - arr[j + 1];
}
}
i--;
}
return arr;
}
</script>
</head>
<body>
</body>
</html>


选择排序:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Select Sort</title>
<script type="text/javascript">
var arr = [3, 2, 4, 9, 1, 5, 7, 6, 8];
console.log(selectSort(arr));
function selectSort(arr) {
var index = 0; // 记录最小数据的数组下标
if((arr == undefined) || (arr.length == 0)) {
return arr;
}
for(let i=0; i<arr.length; i++) {
index = i;
for(let j=i+1; j<arr.length; j++) {
if(arr[j] < arr[index]) {
index = j;
}
}
if(index == i) continue;
arr[i] = arr[i] + arr[index];
arr[index] = arr[i] - arr[index];
arr[i] = arr[i] - arr[index];
}
return arr;
}
</script>
</head>
<body>
</body>
</html>


插入排序:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert Sort</title>
<script type="text/javascript">
var arr = [3, 2, 4, 9, 1, 5, 7, 6, 8];
console.log(insertSort(arr));
function insertSort(arr) {
if((arr == undefined) || (arr.length < 2)) {
return 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] + arr[j-1];
arr[j-1] = arr[j] - arr[j-1];
arr[j] = arr[j] - arr[j-1];
} else {
break;
}
}
}
return arr;
}
</script>
</head>
<body>
</body>
</html>


希尔排序:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Shell Sort</title>
<script type="text/javascript">
var arr = [3, 2, 4, 9, 1, 5, 7, 6, 8];
console.log(shellSort(arr));
function shellSort(arr) {
if((arr == undefined) || (arr.length < 2)) {
return arr;
}
var len = arr.length;
for(var fraction=Math.floor(len/2); fraction>0; fraction=Math.floor(fraction/2)) {
for(var i=fraction; i<len; i++) {
for(var j=i-fraction; j>=0 && arr[j]>arr[fraction+j]; j=j-fraction) {
arr[j] = arr[j] + arr[fraction+j];
arr[fraction+j] = arr[j] - arr[fraction+j];
arr[j] = arr[j] - arr[fraction+j];
}
}
}
return arr;
}
</script>
</head>
<body>
</body>
</html>


归并排序:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Merge Sort</title>
<script type="text/javascript">
function merge(arr, low, mid, high) {
var i = low;
var j = mid + 1;
var k = 0;
var tmp = [high - low + 1];
while(i <= mid && j <= high) {
if(arr[i] <= arr[j]) {
tmp[k] = arr[i];
i++;
k++;
} else {
tmp[k] = arr[j];
j++;
k++;
}
}
while(i <= mid) {
tmp[k] = arr[i];
i++;
k++;
}
while(j <= high) {
tmp[k] = arr[j];
j++;
k++;
}
for (k = 0, i = low; i <= high; i++, k++) {
arr[i] = tmp[k];
}
}

function sort(arr) {
var len = arr.length;
for (let gap = 1; gap < len; gap = 2 * gap) {
var i = 0;
for (i = 0; i + 2 * gap - 1 < len; i = i + 2 * gap) {
merge(arr, i, i + gap - 1, i + 2 * gap - 1);
}
if (i + gap - 1 < len) {
merge(arr, i, i + gap - 1, len - 1);
}
}
return arr;
}

var arr = [3, 2, 4, 9, 1, 5, 7, 6, 8];
console.log(sort(arr));
</script>
</head>
<body>
</body>
</html>


快速排序:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Quick Sort</title>
<script type="text/javascript">
function quickSort(arr) {
function sort(prev, numsize) {
var nonius = prev;
var j = numsize - 1;
var flag = arr[prev];
if((numsize-prev) > 1) {
while(nonius < j) {
for(; nonius < j; j--) {
if(arr[j] < flag) {
arr[nonius] = arr[j];
nonius++;
break;
}
}
for(; nonius < j; nonius++) {
if(arr[nonius] > flag) {
arr[j] = arr[nonius];
j--;
break;
}
}
}
arr[nonius] = flag;
sort(0, nonius);
sort(nonius+1, numsize);
}
}
sort(0, arr.length);
return arr;
}
var arr = [3, 2, 4, 9, 1, 5, 7, 6, 8];
console.log(quickSort(arr));
</script>
</head>
<body>
</body>
</html>


堆排序:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Heap Sort</title>
<script type="text/javascript">
Array.prototype.buildMaxHeap = function() {
for(let i=Math.floor(this.length/2)-1; i>=0; i--) {
this.heapAdjust(i, this.length);
}
};

Array.prototype.heapAdjust = function(i, j) {
var largest = i;
var left = 2*i + 1;
var right = 2*i + 2;

if(left<j && this[largest]<this[left]) {
largest = left;
}

if(right<j && this[largest]<this[right]) {
largest = right;
}

if(largest != i) {
this.swap(i, largest);
this.heapAdjust(largest, j);
}
};

Array.prototype.swap = function(i, j) {
this[i] = this[i] + this[j];
this[j] = this[i] - this[j];
this[i] = this[i] - this[j];
};

Array.prototype.headSort = function() {
this.buildMaxHeap();
for(let i=this.length-1; i>0; i--) {
this.swap(0, i);
this.heapAdjust(0, i);
}
return this;
};

var arr = new Array();
[].push.apply(arr, [3, 2, 4, 9, 1, 5, 7, 6, 8]);
console.log(arr.headSort());
</script>
</head>
<body>
</body>
</html>


计数排序:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Count Sort</title>
<script type="text/javascript">
Array.prototype.init = function() {
for(let i=0; i<this.length; i++) {
this[i] = 0;
}
}
function countSort(a) {
var b = new Array(a.length);
b.init();
var max = a[0];
var min = a[0];
for(let i in a) {
if(a[i] > max) {
max = a[i];
}
if(a[i] < min) {
min = a[i];
}
}
var k = max - min + 1;
var c = new Array(k);
c.init();
for(let i=0; i<a.length; ++i) {
c[a[i]-min] += 1;
}
for(let i=1; i<c.length; ++i) {
c[i] = c[i] + c[i-1];
}
for(let i=a.length-1; i>=0; --i) {
b[--c[a[i]-min]] = a[i];
}
return b;
}

var a = [3, 2, 4, 9, 1, 5, 7, 6, 8];
console.log(countSort(a));
</script>
</head>
<body>
</body>
</html>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  javascript