快速排序(java代码)

一、快排核心思想

快排核心思想就是:首先在待排序数组中随便选择一个数作为节点(pivot),然后从最后面(high)往左查找比这个节点(pivot)小的数,并且从最前面(low)往右查找比这个节点(pivot)大的数(low),情况1:找到后就把这两个数进行交换,然后接着上面的查找交换直到low等于high,球后将节点(pivot)与low位置处的数进行交换,这样比pivot小的数都在其前面,比pivot大的数就在其后面,然后把数组以pivot分为两半,重复上述操作;情况2:直到low 等于 high都没有找到,就直接交换pivot和low位置的数据,然后同样的将数组以pivot分为两半重复上述操作。(说的挺抽象的,还是看看下面举例吧)

二、实例

以数组{6,3,7,1,9,4,8,5,2,10}为例。
1.为了便于理解,就以6作为节点,开始排序时low等于6,high等于10
在这里插入图片描述
2.从由右往左找比节点6小的数就是2,从左往右找比节点6大的数就是7,把这两个数交换(这样查找的目的是为了将大的数放后面,较小的数放前面)
在这里插入图片描述
交换后:
在这里插入图片描述
3.交换后,high接着往左找比节点6小的数,同时low接着往右找比6大的数,分别是5和9,交换low和high
在这里插入图片描述
交换后:
在这里插入图片描述
4.接着相同操作,high往左找到比6小的数4,low往右找大于节点6的数时,low与high相遇,那么本轮查找就结束。接着节点6与low和high的相遇点4交换。这样比6小的数都在其前面,比6da的数都在其后面。
在这里插入图片描述
交换后:
在这里插入图片描述
5.一轮操作结束后,原数组被节点6“一分为二”,分别是比6都小的4,3,2,1,5和比6都大的8,9,7,10两个数组。接着就将这两个数组重复上面的操作,操作完成后理论上是数组被“一分为四”,四个数组再进行上面的操作如此循环

三、代码实现(java)

public class QuickSort {
    //快排实现方法
    public static void quickRow(int[] array, int low, int high){
        int i,j,pivot;
        //结束条件
        if (low >= high) {
            return;
        }
        i = low;
        j = high;
        //选择的节点,这里选择的数组的第一数作为节点
        pivot = array[low];
        while (i < j){
            //从右往左找比节点小的数,循环结束要么找到了,要么i=j
            while (array[j] >= pivot && i < j){
                j--;
            }
            //从左往右找比节点大的数,循环结束要么找到了,要么i=j
            while (array[i] <= pivot && i < j){
                i++;
            }
            //如果i!=j说明都找到了,就交换这两个数
            if (i < j){
                int temp = array[i];
                array[i] = array[j];
                array[j] = temp;
            }
        }
        //i==j一轮循环结束,交换节点的数和相遇点的数
        array[low] = array[i];
        array[i] = pivot;
        //数组“分两半”,再重复上面的操作
        quickRow(array,low,i - 1);
        quickRow(array,i + 1,high);
    }

    //测试
    public static void main(String[] args) {
        int[] array = {6,3,7,1,9,4,8,5,2,10};
        int low = 0,high = array.length - 1;
        quickRow(array,low,high);
        for (int i : array){
            System.out.println(i);
        }
    }
}
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值