Java排序----快速排序

        ”在算法中,快速排序也是一个比较经典的排序,速度也是如其名,非常的快速,具体思想是通过确立一个基准数(为数组的开头),然后从两头依次寻找比他小和比他大的数,一定要先从范围的末尾开始寻找比他小的数(这样可以防止找到最后会换到一个比他大的数到左边去),最后这两个头尾寻找的指针会相遇,这个时候就要停下来了,将他们共同指向的那个数和基准数调换位置,此步叫做“基准数归位“,此步之后,就可以将比基准数小的所有数会到它的左边去,比基准数大的所有数会到它的右边,然后由这个基准数为中心再分为两个区间,重复上面的操作(利用递归算法即可),最后就可以完成排序了!

        例如以下的数组:

int[]arr = {5,8,1,6,2,7,3,9,4,10};

第一步先确定基准数(为数组的开头) 即为5,然后设置头和尾的指针,分别指向5,10。然后从10开始寻找比基准数(5)要小的数,找到则停止,例如找到4,然后停止,这个时候才从头开始寻找比基准数5要大的数,即为8,然后停止,这时候就需要将8和4进行一个交换得到以下数组:

int[]arr = {5,4,1,6,2,7,3,9,8,10};

此时尾指向的是8,头指向的是4 ,从尾部开始继续寻找比基准数小的数,即为3,然后开始头的寻找,于是找到了6,然后交换,得到以下数组:

int[]arr = {5,4,1,3,2,7,6,9,8,10};

此时尾指向的是6,头指向的是3,从尾部开始寻找,找到了2,头则开始寻找,但是这时候头和尾的指针指向同一个数,即为2,于是这个时候则要停止寻找,然后执行基准数归位的操作,即将2与基准数(5)进行一个换位,得到以下数组:

int[]arr = {2,4,1,3,5,7,6,9,8,10};

所以此时,比基准数大的数就会跑到右边,比基准数小的数就会跑到左边,这样便完成了快速排序的第一趟,利用递归,继续排序基准数左右两边的区间,左边区间范围为(0,基准数-1) 右边区间的范围为(基准数+1,数组.length-1),这样就可以重复以上排序方法,最后将所有的数排好。

具体代码实现如下所示:

public class Quicksort {
    public static void main(String[] args) {
        int[]arr = {5,8,1,6,2,7,3,9,4,10};

        quick(arr,0,arr.length-1);
//以下为打印结果
        for (int k = 0; k < arr.length; k++) {
            System.out.print(arr[k] + " ");
        }
    }

    private static void quick(int[] arr, int i, int j) {
        int start = i;
        int end = j;

        if(start > end){
            return;
        }

        int baseNum = arr[start];
        while (start!=end){
            while (true){
                if(start>=end || arr[end] < baseNum){
                    break;
                }
                end--;
            }

            while (true){
                if(start>=end || arr[start] > baseNum){
                    break;
                }
                start++;
            }
            int temp = arr[start];
            arr[start] = arr[end];
            arr[end] = temp;
        }
        int temp = arr[i];
        arr[i] = arr[start];
        arr[start] = temp;
//排序基准数的左区间
        quick(arr,i,start - 1);
//排序基准数的右区间
        quick(arr,start + 1,j);
    }


}

效果图如下:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值