手撕排序-快速排序Java

快速排序
先附赠一张时间复杂度表
手撕排序-快速排序Java_第1张图片图片来源:https://www.cnblogs.com/nannanITeye/archive/2013/04/11/3013737.html

手撕排序-快速排序Java_第2张图片把大象装进冰箱需要几步?恭喜,学会抢答了,三步
那实现快排呢?大体分为四步

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

	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;
    }

你可能感兴趣的:(快速排序,java)