挖坑法
挖坑法,可以理解成拆东墙补西墙。这里以数组[4,1,7,6,9,2,8,0,3,5]为例子讲解。以数据第一个元素作为枢轴(也可以是最后一个,看你喜好)。
这里我们先把作为枢轴的4抠出来单独放置,此时数组变成了
[口,1,7,6,9,2,8,0,3,5]
这时我们要从数组尾部开始往前找,找第一个比4小的数字,5比4大,j - -,这时3比4小,把3放在坑里。因为把3抠出来补坑里了,因此3原来所在的位置又变成了一个坑。
[3,1,7,6,9,2,8,0,口,5]
这时候我们要从数组头部开始往后找,找第一个比4大的数字,1比4小,i + +,这时7比4大,把7放在坑里。这时,7原来的位置又变成了坑。
[3,1,口,6,9,2,8,0,7,5]
接着从数组右边开始找比4小的数,0比4小,把0抠出来放在坑里。0原来的位置又变成了坑。
[3,1,0,6,9,2,8,口,7,5]
接着从数组左边开始找比4大的数字,6比4大,把6抠出来放在坑里。6原来的位置又变成了一个坑。
[3,1,0,口,9,2,8,6,7,5]
接着从右边开始找比4小的数字,8不比4小,j - -,这时2比4小,把2抠出来放在坑里。2原来的位置变成了坑。
[3,1,0,2,9,口,8,6,7,5]
接着从数组左边找比4大的数字,9比4大,把9放进坑里。9原来的位置变成了坑。
[3,1,0,2,口,9,8,6,7,5]
此时i==j,即游标重叠了。这时,我们将一开始取出来的枢轴4放进最后这个坑里。这就完成了第一趟快排。
[3,1,0,2,4,9,8,6,7,5]
你会发现枢轴4左边的数字都比4小,4右边的数字都比4大。
接下来[3,1,0,2]和[9,8,6,7,5]分别都采用这样的挖坑法进行排序。一直到数组只包含一个数字为止,便完成了最终的排序。
public class Test {
static void quicksort(int s[],int left,int right){
if(left<right){
int temp=s[left],i=left,j=right;
while(i<j) {
//寻找右边第一个小于基准值的下标
while(s[j]>=temp&&i<j)j--;
if(i<j) {s[i]=s[j];i++;}
//寻找左边第一个大于基准值的下标
while(s[i]<=temp&&i<