排序算法五:快速排序

思路分析:

取数组最中间的那个数为基数(取哪一个数为基数都可以,取中间的只是为了好理解),在左边找一个比基数大的数,在右边找一个比基数小的数,如果找到就交换两个数的位置,交换过后再向下寻找,直到左边的角标大于等于右边则退出,一轮排序后,基数的左边一定都是比基数小的,基数的右边一定是比基数大的,(注意:基数不一定还在原来的位置,可能出现在基数左边找不到比基数大的数,故而左边找到的数只能是基数本身,而右边找到的数小于基数,此时,仍会发生交换,交换过后,右边的数就是基数本身,然后左边的角标+1,再比较左边的数是否大于基数,大于就交换,以此循环),然后递归基数左边的所有元素(角标从left — r)结束后递归基数右边所有元素(角标 l — right)

代码展示:

 public static void quickSort(int[] arr, int left, int right) {
        int l = left;
        int r = right;

        int pivot = arr[(left + right) / 2];
        int temp;

        while (l < r) {
            while (arr[l] < pivot) {
                l++;
            }

            while (arr[r] > pivot) {
                r--;
            }

            if (l >= r) {
                break;
            }

            temp = arr[l];
            arr[l] = arr[r];
            arr[r] = temp;

            if (arr[l] == pivot) {
                r--;
            }

            if (arr[r] == pivot) {
                l++;
            }
        }

        if (l == r) {
            l++;
            r--;
        }

        if (left < r) {
            quickSort(arr, left, r);
        }

        if (right > l) {
            quickSort(arr, l, right);
        }
    }

效率更高的一种快排


public static void quickSort2(int [] arr,int left,int right) {

        int pivot=0;

        if(left<right) {

            pivot=partition(arr,left,right);

            quickSort2(arr,left,pivot-1);

            quickSort2(arr,pivot+1,right);

        }

    }



    private static int partition(int[] arr,int left,int right) {

        int key=arr[left];

        while(left<right) {

            while(left<right && arr[right]>=key) {

                right--;

            }

            arr[left]=arr[right];

            while(left<right && arr[left]<=key) {

                left++;

            }

            arr[right]=arr[left];

        }

        arr[left]=key;

        return left;

    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值