javascript冒泡排序,快速排序和堆排序
冒泡排序:
比较相邻的元素。如果第一个比第二个大,就交换他们两个。对每一对相邻元素作同样的工作,从开始第一对
到结尾的最后一对。这步做完后,最后的元素会是最大的数。针对所有的元素重复以上的步骤,除了最后一个。持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
<!DOCTYPE html>
<html lang="en">
<head>
</head>
<body>
<script>
function bubbleSort(arr) {
var len = arr.length;
for (var i = 0; i < len; i++) {
for (var j = 0; j < len - 1 - i; j++) {
if (arr[j] > arr[j+1]) {
var temp = arr[j+1];
arr[j+1] = arr[j];
arr[j] = temp;
}
}
}
return arr;
}
var arr = [6, 5, 3, 1, 8, 7, 2, 4];
console.log(bubbleSort(arr));
</script>
</body>
</html>
快速排序和堆排序:
<!DOCTYPE html>
<html lang="en">
<head>
</head>
<body>
<script>
//快速排序:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的
//所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归
//进行,以此达到整个数据变成有序序列。
function quickSort(array) {
function sort(prev, numsize) {
var nonius = prev;
var j = numsize - 1;
var flag = array[prev];
if ((numsize - prev) > 1) {
while (nonius < j) {
for (; nonius < j; j--) {
if (array[j] < flag) {
array[nonius++] = array[j]; //a[i] = a[j]; i += 1;
break;
};
}
for ( ; nonius < j; nonius++) {
if (array[nonius] > flag) {
array[j--] = array[nonius];
break;
}
}
}
array[nonius] = flag;
sort(0, nonius);
sort(nonius + 1, numsize);
}
}
sort(0, array.length);
return array;
}
//堆排序:堆分为最大堆和最小堆,其实就是完全二叉树。最大堆要求节点的元素都要不小于其孩子,最小堆要求节点元素
//都不大于其左右孩子,两者对左右孩子的大小关系不做任何要求,其实很好理解。有了上面的定义,我们可以得
//知,处于最大堆的根节点的元素一定是这个堆中的最大值。其实我们的堆排序算法就是抓住了堆的这一特点,每
//次都取堆顶的元素,将其放在序列最后面,然后将剩余的元素重新调整为最大堆,依次类推,最终得到排序的序列。
Array.prototype.buildMaxHeap = function() {
for(var i = Math.floor(this.length / 2) - 1; i >= 0; i--) {
this.heapAdjust(i, this.length);
}
};
Array.prototype.swap = function(i, j){
var tmp = this[i];
this[i] = this[j];
this[j] = tmp;
};
Array.prototype.heapSort = function() {
this.buildMaxHeap();
for(var i = this.length - 1; i > 0; i--) {
this.swap(0,i);
this.heapAdjust(0,i);
}
return this;
};
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);
}
};
var arr = [6, 5, 3, 1, 8, 7, 2, 4];
console.log('排序前:', arr);
console.log('快速排序:', quickSort(arr));
arr = [6, 5, 3, 1, 8, 7, 2, 4];
console.log('排序前:', arr);
console.log('堆排序:', arr.heapSort());
</script>
</body>
</html
堆排序参考链接:https://www.cnblogs.com/0zcl/p/6737944.html