简单理解java快速排序法

首先,下面的代码是我学了网上大神教的快速排序法修改的,代码里每一部分都有注释,不多说了,直接上代码,简单粗暴

public class QuickSort {
     public static void main(String[] args) {
         /*
          * 思想:二分法
          * 建议:不太理解的,可以打断点去看,我觉得debug看会对这个排序法更了解,代码直接可以运行
          * 用这个数组为例子int [] arry = {6,1,2,7,9,3,4,5,10,8};
          * 整体思路:取第一个数为基准,然后最终要达到的结构其实就是这样,比6小的数   6  比6大的数,第一轮比较完毕后,              *  继续然后二分法思想,调用递归,多次重复以上操作
          * 后面还有改进的方法
          */
        int [] arr = {6,1,2,7,9,3,4,5,10,8};
        sort(arr,0,9);
        for(int i = 0;i < arr.length;i++){
            System.out.print(arr[i] + " ");
        }
    }
     public static void sort(int arr[],int low,int high)
     {
         int l=low;
         int h=high;
         int standard=arr[low];//定这个数为基准
         
         while(l<h)//这里要记得加l<h,这是递归结束的判断
         {
             while(l<h&&arr[h]>=standard){//这里要记得加l<h,这是避免数组下标越界
                 h--;//如果比较的数比基准数大,h--,否则进入下面的交换两个比较数的位置,这里是从后往前
             }
             if(l<h){//与前面的数交换
                 int temp=arr[h];
                 arr[h]=arr[l];
                 arr[l]=temp;
                 l++;
             }
             
             while(l<h&&arr[l]<=standard){
                 l++;//如果比较的数比基准数小,l++,否则进入下面的交换两个比较数的位置,这里是从前往后
             }
             if(l<h){//与后面的数交换
                 int temp=arr[h];
                 arr[h]=arr[l];
                 arr[l]=temp;
                 h--;
             }
         }
         if(l>low){
             sort(arr,low,l-1);//把排序后(第一轮是比6小的数,以此类推 )的右边再重复sort排序,二分法思想,l-1就是左边的最后一个数的下标
         }
         if(h<high){
             sort(arr,l+1,high);//把排序后(第一轮是比6大的数,以此类推 )的左边再重复sort排序,二分法思想
         }
     }
}

优化:就是对基准数的优化,三数取中法

   举例:待排序序列为:8 1 4 9 6 3 5 2 7 0
    左边为:8,右边为0,中间为6
    我们这里取三个数排序后,中间那个数作为枢轴,则枢轴为6,所以取6为基准数

猜你喜欢

转载自blog.csdn.net/qq_39153893/article/details/82557891
今日推荐