Java--快速排序

本文章参考博客:白话经典算法系列之六 快速排序 快速搞定

1.思路

1.数组中选一个基数key,通常是取数组第一个(这时候会在坐标0的位置留下空位);

2.定义两个指针left,right,分别指向数组最左端和最右端,并依次向数组中间逼近。先从右边开始判断,一直向左移动指针,直到数据小于基数key,将其移动到基数之前的坐标(基数留下的空位),移动完之后也会在坐标位置留下一个空位right;再从左边开始判断,一直向右移动指针,直到数据大于基数key,将其移动到刚才right移动所留下的空位上;最后当left==right时也会有个空位,再将基数放入这个空位中,这样一轮下来,left坐标位置的左侧所有的数都比基数key小,右侧所有的数都比基数大。

3.数组就一分为二,再用递归,分别对左右两侧的数组进行上述步骤。

2.代码

public static void quickSort(int[] array,int leftInput,int rightInput){
        //因为坐标需要不停的变动,不能改动输入的参数(等会递归的时候需要用到),所以新建两个指针
        int left = leftInput;
        int right = rightInput;
        //递归退出的条件
        if (left >= right)
            return;
        //选基数
        int key = array[left];
        while (left < right){
            while(left < right && array[right] >= key){
                //从右侧找起,找一个比基数小的数
                right--;
            }
            if (left < right){
                //将这个数填充到基数刚才的坑上
                array[left] = array[right];
                left++;
            }
            while(left < right && array[left] <= key){
                //从左侧找起,找一个比基数大的数
                left++;
            }
            if (left < right){
                //找到了,就将这个数放到刚才的位置上
                array[right] = array[left];
                right--;
            }
        }
        //到这  left坐标和right坐标重叠,坐标左边的都比key大,坐标右边的都比key大
        //把key放到left坐标位置上
        array[left] = key;
        //递归左边的数组
        quickSort(array,leftInput,left-1);
        //递归右侧的数组
        quickSort(array,left+1,rightInput);
    }

调用示例

public static void main(String[] args) {
        int[] array = new int[]{11,55,22,14,44,55,33,6};
        quickSort(array,0,array.length-1);
        for(int c : array){
            System.out.print(c+",");
        }
}

你可能感兴趣的:(Java--快速排序)