1、冒泡排序
let arr =[9,8,11,1,30]
function bubble_sort(arr){
let swap
for(let i=0;i<arr.length-1;i++){
for(let j=0;j<arr.length-i-1;j++){
if(arr[j]>arr[j+1]){
swap=arr[j]
arr[j]=arr[j+1]
arr[j+1]=swap
}
}
}
}
bubble_sort(arr)
console.log(arr) //[1, 8, 9, 11, 30]
2、快速排序
let arr =[9,8,11,1,30]
function quick_sort(arr){
if(arr.length<=1){
return arr;
}
const pivotIndex=Math.floor(arr.length/2);
const pivot=arr.splice(pivotIndex,1)[0];
const left=[];
const right=[];
for(let i=0;i<arr.length;i++){
if(arr[i]<pivot){
left.push(arr[i]);
}else{
right.push(arr[i]);
}
}
return quick_sort(left).concat([pivot],quick_sort(right));
}
console.log(quick_sort(arr)) //[1, 8, 9, 11, 30]
console.log(arr) //[9, 8, 1, 30]
3、选择排序
let arr =[9,8,11,1,30]
function selection_sort(arr) {
var len = arr.length;
var minIndex, swap;
for (let i = 0; i < len - 1; i++) {
minIndex = i;
for (let j = i + 1; j < len; j++) {
if (arr[j] < arr[minIndex]) { //寻找最小的数
minIndex = j; //将最小数的索引保存
}
}
swap = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = swap;
}
return arr;
}
console.log(selection_sort(arr)) //[1, 8, 9, 11, 30]
console.log(arr) //[1, 8, 9, 11, 30]
4、插入排序
let arr =[9,8,11,1,30]
function insertion_sort(arr) {
for (var i = 1; i < arr.length; i++) {
var key = arr[i];
var j = i - 1;
while ( arr[j] > key) {
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = key;
}
return arr;
}
console.log(insertion_sort(arr)) //[1, 8, 9, 11, 30]
console.log(arr) //[1, 8, 9, 11, 30]
5、希尔排序
let arr =[9,8,11,1,30]
function shell_sort(arr) {
var len = arr.length,
temp,
gap = 1;
while(gap < len/5) { //动态定义间隔序列
gap =gap*5+1;
}
for (gap; gap > 0; gap = Math.floor(gap/5)) {
for (var i = gap; i < len; i++) {
temp = arr[i];
for (var j = i-gap; j >= 0 && arr[j] > temp; j-=gap) {
arr[j+gap] = arr[j];
}
arr[j+gap] = temp;
}
}
return arr;
}
console.log(shell_sort(arr)) //[1, 8, 9, 11, 30]
console.log(arr) //[1, 8, 9, 11, 30]
6、桶排序
//桶排序
function bucketSort(ary, bucketCount) {
//类型检查
if (!isArray(ary)) return false;
if (ary.length <= 1) return ary;
//初始化变量参数
bucketCount = bucketCount || 5;
var len = ary.length,
buckets = [], //桶数组
max = min = ary[0], //默认取出首位
space, //数值范围
i;
//找出最大值最小值
for (i = 1; i < len; i++) {
min > ary[i] && (min = ary[i]);
max < ary[i] && (max = ary[i]);
}
//求出每一个桶的数值范围(向下取值并且加一),范围取值(min -> >=max)
space = Math.floor((max - min) / bucketCount) + 1;
//将数值装入桶中
for (i = 0; i < len; i++) {
var item = ary[i], //值
index = Math.floor((item - min) / space), //难点一,找到相应的桶序列
bucket = buckets[index]; //桶序列数组
//判断是否有对应桶
if (bucket) {
//因为数组从小到大排列
var bucketLen = bucket.length - 1;
//难点二,逆向比较大小,符合条件数值后移一位,k减一
while (bucketLen >= 0 && bucket[bucketLen] > item) {
bucket[bucketLen + 1] = bucket[bucketLen];
bucketLen--;
}
//对应位置插入数组
bucket[bucketLen + 1] = item;
} else {
//新增数值入桶(这裡不能引用变量bucket,详情http://www.qdfuns.com/notes/40831/dd2b82537d74065b8a53b75e2eb85715.html)
buckets[index] = [item];
}
}
//开始合并数组
// 方法一,返回数字格式数组,但是步骤性能都较差
/* var n = 0, result = [];
while(n < bucketCount) {
//中间可能有没有符合范围的断层数组
if(buckets[n]) result = result.concat(buckets[n]);
n++;
}
return result */
//方法二,返回字符串格式数组,简单方便(平均时间快几毫秒级别)
return buckets.join(',').split(',');
}
useTime("桶排序算法", bucketSort);
//是否数组
function isArray(obj) {
var bol = Object.prototype.toString.call(obj) === "[object Array]";
!bol && alert("当前入参非数组类型!");
return bol;
}
//计时小玩意
function useTime(name, fn) {
var ary = [
616,
380,
751,
317,
561,
722,
246,
907,
970,
614,
446,
917,
403,
663,
312
];
console.time(name + "耗时");
console.log("排序前: ", ary);
console.log("排序后: ", fn(ary));
console.timeEnd(name + "耗时");
}