快速排序算法

核心思想:定义一个参考值,将比参考值小的放在参考值左边,比参考值大的放右边。这样,就找出了参考值在数组中的位置。

代码实现重点: 

  1. 方法传入三个参数,原数组,左边界low,右边界high。
  2. 定义两个指针指向左右边界,以便来遍历数组;再定义一个临时变量记录参考值。
  3. 当左指针小于右指针时,先向左移动右指针(?),找到一个比参考值小的元素,然后覆盖左指针指向的元素(?),左指针移动一位;再向右移动左指针,指向一个比参考值大的元素,覆盖右指针指向的元素,右指针移动一位。
  4. 当退出while循环后,左右指针指向数组中的同一个位置,将参考值放在该位置上,即找到了参考值在数组中从小到大顺序排序的位置。
  5. 在参考值的左右两边进行递归排序。

问:为什么需要先移动右指针?

因为,首先保存的是左边界上的值,由于左边界上的值保存了一份,所以可以放心首先覆盖。如果第一次覆盖的是右边的值,那数组中就会直接少一个元素。如果保存的是右边界的值,那么就可以先移动左指针。

代码实现如下:

import java.util.Arrays;

public class QuickSort {

    private static void quickSort(int[] arr){
        if(arr==null||arr.length==0) return;
        quickSort(arr,0,arr.length-1);
    }

    private static void quickSort(int[] arr,int low,int high){

        if(low>=high){
            return;
        }

        int i=low,j=high,index=arr[low];
        while(i<j){

            while(i<j&&arr[j]>=index){
                j--;
            }
            if(i<j){
                arr[i]=arr[j];
                i++;
            }
            while(i<j&&arr[i]<index){
                i++;
            }
            if(i<j){
                arr[j]=arr[i];
                j--;
            }
        }

        arr[i]=index;

        quickSort(arr,low,i-1);
        quickSort(arr,i+1,high);
    }

    public static void main(String args[]){
        int[] arr=new int[]{9,8,7,6,5,4,3,2,1};
        int[] temp=new int[arr.length];
        quickSort(arr);
        System.out.println(Arrays.toString(arr));
    }
}

如果保存的是右边界的值,则先移动左指针。

import java.util.Arrays;

public class QuickSort {

    private static void quickSort(int[] arr){
        if(arr==null||arr.length==0) return;
        quickSort(arr,0,arr.length-1);
    }

    private static void quickSort(int[] arr,int low,int high){

        if(low>=high){
            return;
        }

        int i=low,j=high,index=arr[high];
        while(i<j){


            while(i<j&&arr[i]<index){
                i++;
            }
            if(i<j){
                arr[j]=arr[i];
                j--;
            }
            while(i<j&&arr[j]>=index){
                j--;
            }
            if(i<j){
                arr[i]=arr[j];
                i++;
            }
        }

        arr[i]=index;

        quickSort(arr,low,i-1);
        quickSort(arr,i+1,high);
    }

    public static void main(String args[]){
        int[] arr=new int[]{9,8,7,6,5,4,3,2,1};
        int[] temp=new int[arr.length];
        quickSort(arr);
        System.out.println(Arrays.toString(arr));
    }
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值