快速排序

时光毁灭记忆、已成空白 提交于 2019-11-26 12:51:27

基础排序:快速排序

算法实现:

  1. 在排序数组中选择一个数作为基数(我这里选择数组末尾的数)
  2. 根据基数把数组切为三个部分:1.比基数小的在左边;2.比基数大的在右边;3.跟基数相等的在中间
  3. 如此分开后,三个小数组整体有序(三个数组只是以下标分开,并不是新建数组)
  4. 递归左右两个小数组
  5. 最后得到的数组就是有序的
public class QuickSort {

    private void swap(int[] arr,int i,int j){
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }

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

    private void quickSort(int[] arr,int L,int R){
        if(L < R){
            int[] p = partition(arr,L,R);
            //对左边进行递归
            quickSort(arr,L,p[0] - 1);
            //对右边进行递归
            quickSort(arr,p[1] + 1,R);
        }
    }

	//将数组分为三个部分
    private int[] partition(int[] arr,int L,int R){

		//左边数组的末尾下标
        int less = L - 1;
        //右边数组的起始下标
        int more = R + 1;
        //开始比较的数
        int cur = L;
        //选择的基数
        int tem = arr[R];

        while(cur  < more){
            if(arr[cur] < tem){			//左边数组
                swap(arr,++less,cur++);
            }else if(arr[cur] > tem){	//右边数组
                swap(arr,--more,cur);
            }else{
                cur++;					//中间数组
            }
        }
        //返回中间数组的起始下标和末尾下标
        return new int[] {less + 1,more - 1};
    }

	//test
    public static void main(String[] args) {

		//随机数组
        int[] arr = new int[(int) ((100 + 1) * Math.random())];
        for (int i = 0; i < arr.length; i++) {
            arr[i] = (int) ((100 + 1) * Math.random()) - (int) (100 * Math.random());
        }
        
		QuickSort sort = new QuickSort();
        sort.quickSort(arr);
        
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
    }

}

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!