快速排序解读(递增排序)
1.分治法(Divide-and-ConquerMethod)
function quickSort(arr,left,right){
var pivot;
if(<span style="font-family: Arial, Helvetica, sans-serif;">left</span><span style="font-family: Arial, Helvetica, sans-serif;"><right) {//递归出口:arr只有一个元素</span>
pivot = partition(arr,left,right);
quickSort(arr,left,pivot-1); //对左区间递归排序
quickSort(arr,pivot+1,right); //对右区间递归排序
}
}
2.partition
目的:找一个pivot(这里找数组最左端的),将这个pivot放在合适的位置,
pivot的左边元素都小于它,右边的元素都大于它
eg: [6,2,4,1,9,10,3,5] //6是pivot
[5,2,4,1,3,6,9,10] //partition之后
要点:1.找一个pivot(这里找数组最左端的)
2.设置一个索引i,这个索引记录的是小于pivot的元素个数,初始值为l
function partition(arr ,left ,right){
var i=left ,j;
function swap(i,j){
var temp = arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
for(j=left+1;j<=right;j++){
if(arr[j]<=pivot ){
i++; //i记录了小于pivot的元素个数
if(arr[i]!=arr[j] ){
swap(i,j);
}
}
}
swap(left,i);
}
解说:pivot=6, left = 0,right=7,j的初始值为1,i的初始值为0
当 j=3时,i也等于3
[6 , 2 , 4 , 1 , 9, 10 , 3 , 5 ]
i,j
当 j=5时,因为arr[4],arr[5]都大于pivot,所以i不递增,i=3
[6 , 2 , 4 , 1 , 9, 10 , 3 , 5 ]
i j
当 j=6时,arr[6]<pivot,所以i++
[6 , 2 , 4 , 1 ,9, 10 ,3, 5 ]
i j
并且arr[i]和arr[j]交换位置
[6 , 2 , 4 , 1 , 3, 10 , 9 , 5 ]
当 j =7时 arr[7]<pivot,所以i++
[6 , 2 , 4 , 1 , 3, 10 ,9 ,5 ]
i j
并且arr[i]和arr[j]交换位置
[6 , 2 , 4 , 1 , 3, 5 ,9 , 10 ]
i
最后swap(left,i)
[5 , 2 , 4 , 1 , 3, 6 ,9 , 10 ]