快速排序java实现


public class QuickSort {
    public static void quickSort(int[] arr, int left, int right){
        int temp;
     //要排序数组的起始位置
        int i = left;
     //要排序数组的结束位置
        int j = right;
     //当起始位置小于结束位置时,进行排序,否则不执行任何操作
        if (left < right){
            // temp存放基准数("枢轴"),此时相当于把基准数存到temp中了,然后arr[left]即arr[i]的位置就相当于空出来了
            temp = arr[left];
       // 下面这个循环完成了一趟排序,即数组中小于temp的元素放在左边,大于temp的元素放在右边。左边和右边的分界点就是temp的最终位置
            while (i != j){
                // 先从右往左扫描,只要比temp大,j就向左移,直到找到一个比"枢轴"temp小的数
                while (i < j && arr[j] > temp){ --j; }
          // 找到一个比temp小的数,判断一下如果左指针小于右指针(即i和j相对位置还满足前后关系)
                if (i < j){
                    // 则把该数放到temp左边,即把arr[j]放到空出的arr[i]位置,现在arr[j]的位置空出了,然后再从左往右扫描
                    arr[i] = arr[j];
                    // i指针右移一位(开始从左边扫描)
                    i++;
                }
                // 再从左往右扫描,只要比temp小,i就向右移,直到找到一个比"枢轴"temp大的数
                while (i < j && arr[i] < temp){ ++i; }
          // 找到一个比temp大的数,判断一下如果左指针小于右指针(即i和j相对位置还满足前后关系)
                if (i < j){
                    // 则把该数放到temp右边,把该数arr[i]放到上次空出的arr[j]位置,然后再从右往左扫描
                    arr[j] = arr[i];
                    // j指针左移一位(又开始从右边扫描)
                    j--;
                }
            }
            // 当i==j时,将一开始存好的"枢轴"temp放在最终位置(把数组分成两部分了),一趟快速排序完成
            arr[i] = temp;
            // temp的左边部分再进行快速排序(依次递归实现)
            quickSort(arr, left, i-1);
       // temp的右边部分再进行快速排序(依次递归实现)
            quickSort(arr, i+1, right);
        }
    }

    public static void main(String[] args){
        int[] arr = {4,6,7,1,2,3,5};
        quickSort(arr, 0, arr.length-1);
        for (int a : arr){
            System.out.print(a+" ");
        }
    }
}
 

运行结果:

原文地址:https://www.cnblogs.com/cdlyy/p/12535695.html