基本原理:
1、从一个数组中任意挑选一个元素作为中轴元素;
2、将剩下的元素以中轴元素作为比较的标准,将小于等于中轴元素的放到中轴元素的左边,将大于中轴元素的放到中轴元素的右边;
3、以当前中轴元素的位置为界,将左半部分子数组和右半部分子数组看成两个新的数组
4、重复上述操作,直到子数组的元素个数小于等于1(因为一个元素的数组必定是有序的)。
var quickSort = function (arr) {
if (arr.length <= 1) {//如果数组长度为1,返回数组
return arr;
}
var pivotIndex = Math.floor(arr.length / 2);//取中轴位置
var pivot = arr.splice(pivotIndex, 1);//取中轴位置的元素
var left = []; //定义左边数组
var right = []; //定义右边数组
for (var i = 0; i < arr.length; i++) {//遍历数组
if (arr[i] < pivot) {//遍历数组每个数与中轴元素值比较大小
left.push(arr[i]);//小于中轴元素值放在左边数组
} else {
right.push(arr[i]);//大于中轴元素值放在右边数组
}
}
return quickSort(left).concat([pivot], quickSort(right));//递归以上操作,对左右数组进行排序,直到左边或者右边数组长度小于等于1
};
- Math.floor( )方法:是向下取整计算,它返回的是小于或等于函数参数,并且与之最接近的整数。例如:var x = Math.floor(2.6); x = 2;
var x = Math.floor(0.6); x = 0;
var x = Math.floor(5.1); x = 5;
var x = Math.floor(-5.1); x = -6;
var x = Math.floor(-5.9); x = -6; - splice( )方法:方法向(从)数组中添加(删除)项目,然后返回被删除的项目。
注释:该方法会改变原始数组。
-
- var arr = [1,2,3,4,5];
arr.splice(2,0,"A");
arr = [1,2,A,3,4,5];
-
- var arr = [1,2,3,4,5];
arr.splice(2,1,"A");
arr = [1,2,A,4,5];
-
- var arr = [1,2,3,4,5];
arr.splice(2,3,"A");
arr = [1,2,A];
- concat( )方法:用于连接两个或多个数组。不会改变现有的数组,只会返回被连接数组的一个副本。
- 递归:在运行的过程中调用自己。就是包子馅的包子,极限是变成馒头。
时间复杂度:最优O(n2);最差O(nlogn);平均O(nlogn);
空间复杂度:最优O(logn) ;最差O(n);