一、冒泡排序
原理:每一次比较数组中相邻的两个数据大小,如果前一个数据大于后一个数据,就交换这两个数据的位置。
特点:简单易于理解,但比较次数多,效率差。
var times = 0; // 用于计算排序次数
var bubbleSort = function(arr) {
var temp;
for(var i = 0; i < arr.length - 1; i++){
for(var j = i+1; j < arr.length; j++){
if(arr[i] > arr[j]) {
/* 如果前者大于后者,则先将前者存储于一个变量中,
* 然后将后者放置于前者的位置,再将变量中的数据
* 放于后者的位置,达到交换的目的
*/
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
times++;
}
}
}
return arr;
}
bubbleSort(arr); // arr数组长度为1000
console.log(times); // 250855 排序次数
结果:长度为1000的数组,冒泡排序的次数为250855次
二、快速排序
原理:取一个数组的中部为基准点,将数组中每一个数据与基准点比较,比它小的放进左边的一个空数组,比它大的放进右边的一个空数组,然后对左右数组进行递归操作,直至数组长度 <=1。
特点:效率好,常用,但递归一次就要另外声明两个数组,占用了内存。
var times = 0; // 用于计算排序次数
var quickSort = function(arr) {
// 如果递归数组至长度为1,就停止排序返回
if(arr.length <= 1) {
return arr;
}
// 取数组基准点
var midIndex = Math.floor(arr.length/2);
var midValue = arr.splice(midIndex,1);
// 用左右两个空数组接收小于基准点的数据与大于基准点的数据
var leftArr = [];
var rightArr = [];
for(var i=0; i < arr.length; i++){
if(arr[i] < midValue) {
leftArr.push(arr[i]);
}else {
rightArr.push(arr[i]);
}
times++;
}
// 递归操作
return quickSort(leftArr).concat(midValue,quickSort(rightArr));
};
quickSort(arr);
console.log(times); // 10260 排序次数
结果:长度1000的数组,快速排序次数为10260次。