快速排序的java实现

快速排序

快速排序是不稳定的排序算法,本文利用两种方法实现快速排序。


方法一

方法的主要思想是选取数组右端作为比较位置,先从左边比较,当找到大于比较值的元素,将该位置的值赋给right位置,right–;然后从右边开始比较,当找到小于等于比较值的元素,将该位置的值赋给left位置,left++;循环往复,直到不满足left<right,将比较值赋值给right。再结合递归思想,完成左右两边的比较,最终使数组有序。

public static void quickSort(int[] arr,int low,int high) {
    if(low < high){
        //分成两部分
        int index = partition(arr,low,high);
        //对左边进行快排
        quickSort(arr,low,index-1);
        //对右边进行快排
        quickSort(arr,index+1,high);
    }

}

public static int partition(int[] arr, int low, int high) {
    int left = low;
    int right = high;
    int compare = arr[high];

    //使用循环实现左边小于等于比较值,右边大于比较值
    while(left<right){
        while(arr[left]<=compare && left<right){
            left++;
        }
        if(left<right){
            arr[right--] = arr[left];
        }
        while(arr[right]>compare && left<right){
            right--;
        }
        if(left<right) {
            arr[left++] = arr[right];
        }
    }
    // 将比较值赋值给中间
    arr[right] = compare;
    // 返回位置索引
    return right;
}

方法二

方法的主要思想是将数组中小于比较位置值的放左边,等于的放中间,大于的放右边;再结合递归思想,完成左右两边的比较,最终使数组有序。该方法的最大优点是中间部分不用参与下次递归。

    public static void sort(int[] nums){
        if(nums==null){
            return;
        }
        quickSort(nums,0,nums.length-1);
    }


    public static void quickSort(int[] nums,int i,int j){
        if(i<j){
            int[] p = partation(nums,i,j);
            quickSort(nums,i,p[0]-1);
            quickSort(nums,p[1]+1,j);
        }
    }

    public static int[] partation(int[] nums,int i,int j){
        // 利用随机数作为比较位置
        // int k = (int) (Math.random()*(j-i)+i);
        // swap(nums,k,j);
        int less = i-1;
        int more = j;
        // 取最后一个作为比较位置,小于的放左边,等于的放中间,大于的放右边
        // 假如数组为2,3,1,5,4,1,3,调用一次变成2,1,1,3,3,5,4,数组的less为2,more为4
        while(i<more){
            if(nums[i]<nums[j]){
                swap(nums,++less,i++);
            }else if(nums[i]==nums[j]){
                i++;
            }else{
                swap(nums,--more,i);
            }
        }
        swap(nums, more, j);
        int[] p = new int[2];
        p[0] = less+1;
        p[1] = more;
        return p;
    }

    public static void swap(int[] nums,int i,int j){
        int temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;

    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值