这个是用递归思想做的一个数组排序,比较适合高配置硬件,因为比较耗内存,优点是速度极快,适合大数据运算;
/**
*@params{
* arr {array} 是将要排序的数组
* leftIndex {number} 要排序数组第一个下标,一般都是0;
* rightIndex {number} 要排序数组的最后一个下标,一般都是arr.length-1,也可以是小于数组总长度的数字,这样将只进行这一部分数的排序
* sort {boolean} 决定数组是按逆序还是顺序排序,默认是true顺序,false逆序
}
*@example{
* var arr = [1, -1, 20, 0, 0, -2, 20, -3, -90, 10, 54, 0, 1, 2, 3, 5, -1, 10];
* QuickSort(arr, 0, arr.length-1);
* console.log(arr);//[-90, -3, -2, -1, -1, 0, 0, 0, 1, 1, 2, 3, 5, 10, 10, 20, 20, 54]
*}
*/
function QuickSort(arr, leftIndex, rightIndex, sort){//从小到大排序
if(!(arr instanceof Array)){
console.log("arr不是一个数组!");
return;
}
if((typeof leftIndex!='number')||(typeof rightIndex!='number')){
console.log("leftIndex或rightIndex不是一个数字!")
return;
}
var l=leftIndex;
var r=rightIndex;
var pivot=arr[parseInt((leftIndex+rightIndex)/2)];//找中间值
var temp=0;
var flag=true;
while(l < r){
if( sort == undefined ||sort == true ){//顺序
while(arr[l] < pivot) l++;
while(arr[r] > pivot) r--;//走位
}else if( sort != undefined && sort==false ){//逆序
while(arr[l] > pivot) l++;
while(arr[r] < pivot) r--;//走位
}else{
flag=false;
console.log("sort值非法,数组未排序!");
break;
}
if(l >= r) break;
temp=arr[l];
arr[l]=arr[r];
arr[r]=temp;
if(arr[l] == pivot) --r;
if(arr[r] == pivot) ++l;//交换完l和r分别走过中间线
}
if(flag){
if(l == r){
l++;
r--;
}
if(leftIndex < r) QuickSort(arr,leftIndex,r,sort);
if(rightIndex > l) QuickSort(arr,l,rightIndex,sort);
}
}