js常见排序总结结

我这数据是获取的,你只要把Arr自己定义一个就可以看到效果


<!DOCTYPE html>

<html lang="en">
<head>
<meta charset="UTF-8">
<title>算法集</title>
<script src="jquery-1.11.3.js"></script>
</head>
<body>
<script>
var Arr = [];
$.get("data.txt", function (data) {//获得数据
var newarr = data.split('\n');
for (var i = 0; i < newarr.length; i++) {
newarr[i] = parseInt(newarr[i]);
}
Arr = newarr;
console.log(Arr);
//冒泡排序
function maopao(arr) {
if (arr.length <= 1) {
return arr;
}
for (var i = 0; i < arr.length - 1; i++) {
for (var j = 0; j < arr.length - 1 - i; 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];
}
}
}
return arr;
}
var arr = Arr;
maopao(arr);
console.log("冒泡排序:" + arr);




//快速排序
function kuaisu(arr) {
if (arr.length <= 1) {
return arr;
}
var left = [],
right = [],
middle = [];
var mid = arr[Math.floor(arr.length / 2)];//随机取数作为关键数据
for (var i = 0; i < arr.length; i++) {
if (arr[i] < mid) {
left.push(arr[i]);
} else if (arr[i] > mid) {
right.push(arr[i]);
} else {
middle.push(mid);
}
}
//合并数组
return [].concat(kuaisu(left), middle, kuaisu(right));
}
var arr2 = Arr;
kuaisu(arr2);
console.log("快速排序:" + kuaisu(arr2));




//插入排序
function charu(arr) {
var tmp;
for (var i = 1; i < arr.length; i++) {
tmp = arr[i];
for (var j = i; j > 0; j--) {
if (arr[j - 1] > tmp) {//找到大的插入
arr[j] = arr[j - 1];
} else {
break;
}
}
arr[j] = tmp;
}
return arr;
}


var arr3 = Arr;
charu(arr3);
console.log("插入排序:" + charu(arr3));


//计数排序
var arr4 = Arr;
var a = arr4.toString().split(",").sort();
// var min = parseInt(a.shift());
var min = Math.min(a);
// var max = parseInt(a.pop());
var max = Math.max(a);
function countSort(arr, min, max) {
var i, z = 0, count = [];
for (i = min; i <= max; i++) {
count[i] = 0;
}
for (i = 0; i < arr.length; i++) {
count[arr[i]]++;
}
for (i = min; i <= max; i++) {
while (count[i]-- > 0) {
arr[z++] = i;
}
}
return arr;
}
countSort(arr4, min, max);
console.log("计数排序:" + arr4);




//桶排序
function tong(arr) {
var bucket = [];//虚拟序列
  var newarr = [];//排好序列
var a = arr5.toString().split(",").sort();
var max = parseInt(a.pop());
for(var i = 0;i<arr.length;i++){
var res = parseInt((arr[i]/(max+1)*9));
if(newarr[res]==undefined){
newarr[res] = [];
newarr[res].push(arr[i])
}else {
var j = 0;
var temp = arr[i];
for(;j<newarr[res].length;j++){
if(newarr[res][j]>arr[i]){
temp = newarr[res][j];
newarr[res][j] = arr[i];
break;//找到刚好大于要插的数据的位子
}
}
for(;j<newarr[res].length;j++){
newarr[res][j-1] = temp;
temp = newarr[res][j];//temp一直是最大
}
newarr[res].push(temp);
}
}
for(var i = 0;i<newarr.length;i++){
if(newarr[i]&&newarr[i].length>0)
bucket = bucket.concat(newarr[i]);
}
return bucket;
}
var arr5 = Arr;
tong(arr5);
console.log("桶排序:" + tong(arr5));




//归并排序
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 guibin(items) {//分成多个序列
if (items.length == 1) {
return items;
}
var middle = Math.floor(items.length / 2),
left = items.slice(0, middle),
right = items.slice(middle);
return merge(guibin(left), guibin(right));
}
var arr6 = Arr;
guibin(arr6);
console.log("归并排序:"+arr6);




//基数排序
function jishu(arr) {
var bucket = [],
max = arr[0];
for (var i = 1; i < arr.length; i++) {
if (arr[i] > max) {
max = arr[i];//找出最大值
}
}
var loop = (max + '').length;
console.log(loop);
for (i = 0; i < 10; i++) {
bucket[i] = [];
}//桶的每个index的长度
for (i = 0; i < loop; i++) {
for (var j = 0; j < arr.length; j++) {
var str = arr[j] + '';
if (str.length >= i + 1) {
k = parseInt(str[str.length - i - 1]);
bucket[k].push(arr[j]);
} else { // 高位为 0
bucket[0].push(arr[j]);
}
}
arr.splice(0, arr.length);//删除第一位的数量
for (j = 0; j < 10; j++) {
var t = bucket[j].length;
for (var k = 0; k < t; k++) {
arr.push(bucket[j][k]);
}
bucket[j] = [];
}
}
return arr;
}
var arr7 = Arr;
jishu(arr7);
console.log("基数排序:"+arr7);

});
</script>
</body>
</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值