快速排序:指定基准数,把小于基准数放基准数左侧,把大于基准数的放右侧。根据当前规则完成一次排序后,对基准数左右两边的数据在重复上述规则排序,直至所有数据排序完成。
下面是根据个人理解画的示意图,有误解或有改进的地方望大佬们指点一二。
- 该示例中基准数定义为数组查找范围的中间项。红色标记基准数。
- 第一次查找:左指针从数组第一项开始向右查找,找到大于基准数停止。右指针从数组最后一项向左查找,找到小于基准数停止。查找完成,交换左指针与右指针所在位置的值。
- 第二次查找:左指针从上一次的位置继续查找,没有找到大于基准数的值,指针到基准数位置停止。右指针也从上一次的位置继续查找,找到小于基准数停止。查找完成,交换左指针与右指针所在位置的值。因为左指针和基准数重叠,交换后,基准数位置更新到同右指针位置一致。
- 第三次查找:左右指针重复上述查找。查找完成,交换左右指针位置的值。因为右指针和基准数重叠,交换后,基准数位置更新到同左指针位置一致。
- 第四次查询:左右指针和基准数重叠,从下图可以看出当前已经完成基准数左侧全小于,基准数右测全大于。
- 根据基准数位置拆分,把左侧数据和右测数据分别重复上述过程。当进行排序的数据范围起始值大于等于结束值时,说明当前范围小于两条数据,无需排序,排序完成。
代码实现
var arr1 = new Array(100);
for(var i = 0; i< arr1.length - 1; i++){
arr1[i] = parseInt(Math.random() * 100));
}
var arr = [2, 11, 5, 8, 13, 10, 7, 4];
var quickSort = function (arr){
function _quickSort(arr, start, end){
if(start >= end){
return;
}
var left = start;
var right = end;
var flag = Math.floor((left + right)/2);
while(left < right){
while(left < flag && arr[left] <= arr[flag]){
left ++;
}
while(right > flag && arr[right] >= arr[flag]){
right --;
}
if(left == right){
continue;
}
var itme = arr[left];
arr[left] = arr[right];
arr[right] = itme;
if(left == flag){
flag = right;
}else if(right == flag){
flag = left;
}
}
_quickSort(arr, start, flag - 1);
_quickSort(arr, flag + 1, end);
}
_quickSort(arr, 0, arr.length - 1);
}
quickSort(arr)
quickSort(arr1)