手撕排序-快速排序Java

把大象装进冰箱需要几步?恭喜,学会抢答了,三步 那实现快排呢?大体分为四步

第一步:走个形式,用来引出真正得快排!

public int[] MySort (int[] arr) {
          
   
	//引出快排实体
        quickSort(arr,0,arr.length-1);
        return arr;
    }

第二步:写出quickSort方法。quickSort方法需要注意得是,由于快排是不断得将区间分为两部分,因此参数为:int[] arr(数组),int left(区间左,开始),int right(区间右,结束),左闭右闭。

public void quickSort(int[] arr,int left,int right){
          
   
        if(left >= right){
          
   
            return;
        }
        //具体方法实现,看第三步,partition
        
    }

第三步:第三步是第二步得实现基础。先给代码,再理解。

public int partition(int[] arr,int left,int right){
          
   
        int i = left,j = right+1;
        int temp = arr[left];
        while(true){
          
   
            while(arr[++i] <= temp) if(i == right) break;
            while(arr[--j] >= temp) if(left == j) break;
            if(i >= j){
          
   
                break;
            }
            
            int ex1 = arr[i];
            arr[i] = arr[j];
            arr[j] = ex1;
        }
        int ex2 = arr[left];
        arr[left] = arr[j];
        arr[j] = ex2;
        return j;
    }

快排得思想就是: 1)以left为基准点,进行比较。int temp = arr[left]; 2)左侧从left+1开始遍历,直至找到比temp大的值(下标为i);右侧从right开始遍历,直至找到比temp小得值(下标为j)。

while(arr[++i] <= temp) if(i == right) break;
    while(arr[--j] >= temp) if(left == j) break;

3)对找到得符合条件得下标i、j进行判断,若i > j则break;否则,交换值。 4)注意,不要忘记这里。在将区间遍历结束后,此时i >= j,j所指向得必然是比temp小得值,交换下标j和left对应得值。 5)return j,j将下次快排分为两部分。

第四步:完善第二步。上面提过第三步是实现第二步得基础,通过第三步返回得j,将数组[left,right]分为[left,j-1]和[j+1,right]。对新的到得区间继续快排。

public void quickSort(int[] arr,int left,int right){
          
   
        if(left >= right){
          
   
            return;
        }
        int j = partition(arr,left,right);
        
        quickSort(arr,left,j-1);
        quickSort(arr,j+1,right);
    }

完整代码如下:我没有将swap()交换值功能单拎出来,但是拎出来更好得。

public int[] MySort (int[] arr) {
          
   
        quickSort(arr,0,arr.length-1);
        return arr;
    }
    public void quickSort(int[] arr,int left,int right){
          
   
        if(left >= right){
          
   
            return;
        }
        int j = partition(arr,left,right);
        
        quickSort(arr,left,j-1);
        quickSort(arr,j+1,right);
    }
    public int partition(int[] arr,int left,int right){
          
   
        int i = left,j = right+1;
        int temp = arr[left];
        while(true){
          
   
            while(arr[++i] <= temp) if(i == right) break;
            while(arr[--j] >= temp) if(left == j) break;
            if(i >= j){
          
   
                break;
            }
            
            int ex1 = arr[i];
            arr[i] = arr[j];
            arr[j] = ex1;
        }
        int ex2 = arr[left];
        arr[left] = arr[j];
        arr[j] = ex2;
        return j;
    }
经验分享 程序员 微信小程序 职场和发展