1.冒泡排序
比较相邻的元素。如果第一个比第二个大,就交换他们两个。对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。针对所有的元素重复以上的步骤,除了最后一个。持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
代码如下:
var arr = [5,4,8,1,3,7,0,9,2,6];
var len = arr.length;
var tmp = null;
for(var j=0; j<len-1; j++){ //循环9次
for(var i=0; i<len-1-j; i++){ //每次比较10-j-1次数
if(arr[i]>arr[i+1]){
tmp = arr[i+1];
arr[i+1] = arr[i];
arr[i] = tmp;
}
} console.log('第'+(j+1)+'次循环',arr);
}
运行结果

2.选择排序
依次找到剩余元素最小值,放置排好序的末尾(第一个放在开头)。代码如下:
var arr = [5,4,8,1,3,7,0,9,2,6]; var len = arr.length; var min = null; var tmp = null; //选择排序 for(var j=0; j<len-1 ; j++){ min = j; for(var i=j+1; i<len ;i++){ if(arr[i] < arr[min]){ min = i; } } tmp = arr[j] arr[j] = arr[min]; arr[min] = tmp; console.log('第'+(j+1)+'次循环', arr); }
运行结果:

3.插入排序
即构建有序序列,未排序数据依次从已排序数据按从后往前比较,插入到合适的位置。代码如下:
var arr = [5,4,8,1,3,7,0,9,2,6];
var len = arr.length;
var cur = null;
var tmp = null;
//插入排序
for(var j=1; j<len ; j++){ //从第二个开始比较
cur = j-1;
tmp = arr[j]; //带插入元素
while (cur >= 0 && arr[cur] > tmp) {
arr[cur+1] = arr[cur];
cur--;
}
arr[cur+1] = tmp;
console.log('第'+(j)+'次循环', arr);
}
运行结果如下:

4.希尔排序
var arr = [5,4,8,1,3,7,0,9,2,6]; function shellSort(arr) { var len = arr.length; var tmp = undefined; var gap = Math.floor(len/2); while(gap >= 1) { for(var i=0; i<len; i++){ for(var j=i; j>=gap; j=j-gap){ if(arr[j] < arr[j-gap]){ tmp = arr[j]; arr[j] = arr[j-gap]; arr[j-gap] = tmp; } } } gap = Math.floor(gap / 2); } console.log(arr); return arr; } shellSort(arr);
运行结果: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
5.快速排序
从将待排序列找出一个基准值,通过比较大小分为两个序列,递归查找直到leng的长度小于2. 用递归方法,如下
var arr = [5,4,8,1,3,7,0,9,2,6]; var len = arr.length; var qsort = function(arr){ var len = arr.length; if (len < 2) return arr; var basic = arr[0]; //默认第一个为基准数 var left = []; var right = []; for(var j=1; j<len ; j++){ if(arr[j] < basic){ left.push(arr[j]); }else { right.push(arr[j]); } } return qsort(left).concat(basic, qsort(right)) }
运行结果

6.归并排序
把序列分成两个长度为n/2的子序列,对这两个子序列分别归并排序(循环将两个数组的第一个值比较,并弹出第一个值, 直到数组长度都不存在),将两个排序好的子序列合并成一个最终的排序序列
var arr = [5,4,8,1,3,7,0,9,2,6];
var merge_sort = function(v){
console.log(v);
var merge = function(left, right){
var final = [];
while(left.length && right.length) { //两个数组的第一个值比较,并删除第一个值
final.push(left[0] <= right[0] ? left.shift() : right.shift());
}
console.log(final.concat(left.concat(right)));
return final.concat(left.concat(right));
}
//将数组分为2组
var len = v.length;
if (len< 2) return v;
var mid = len / 2;
return merge(merge_sort(v.slice(0, parseInt(mid))), merge_sort(v.slice(parseInt(mid))));
}
merge_sort(arr);
运行结果
