Site Overlay

快速排序QuickSort

通过递归算法对比基准值而进行快速的排序

快速排序利用分而治之的思想,它的最好和平均实际复杂度为O(nlogn),但是,如果选取基准的规则正好与实际数值分布相反,例如我们选取第一个数为基准,而原始序列是倒序的,那么每一轮循环,快排都只能把基准放到最右侧,故快排的最差时间复杂度为O(n2)。快排算法本身没有用到额外的空间,可以说需要的空间为O(1);对于递归实现,也可以说需要的空间是O(n),因为在递归调用时有栈的开销,当然最坏情况是O(n),平均情况是O(logn)。快速排序是不稳定的。

实现一

以左边第一个数为基准
public class QuickSort {
    public static void main(String[] args) {
		int[] arr={54,12,42,21,67,34,21};
        quickSort(arr,0,arr.length-1);
    }
    //这个方法就是取找基准数的
    private static void quickSort(int[] arr, int left, int right) {
         // 递归需要出口
        if(left > right){
                return;
        }
        int i = left;
        int j = right;
        int baseNum = arr[left];
        while( i != j){
             while(arr[j] >= baseNum && j > i ){
                j--;
             }
             while(arr[i] <= baseNum && i <j){
                i++;
             }
             int temp = arr[i];
             arr[i] = arr[j];
             arr[j] = temp;
        }
        // 相遇的基准数归位
        arr[left] = arr[j];
        arr[j] = baseNum;

        quickSort(arr,left,i-1);
        quickSort(arr,j+1,right );

    }
}

实现二

取中间一个数为基准分界值
public class quickSort {
    public static void main(String[] args) {
        int[] arr={54,12,42,21,67,34,21};
        System.out.println("排序前:"+ Arrays.toString(arr));
        quickSort(arr,0,arr.length-1);
        System.out.println("排序后:"+ Arrays.toString(arr));
    }

    public static void quickSort(int[] arr,int left,int right){
        int ltemp=left,rtemp=right;
        int temp,mid;
        mid=arr[(left+right)/2];                         //分界值
        while(ltemp<rtemp){
            while (arr[ltemp]<mid){
                ltemp++;
            }
            while (arr[rtemp]>mid){
                rtemp--;
            }
            if(ltemp<=rtemp){
                temp=arr[ltemp];
                arr[ltemp]=arr[rtemp];
                arr[rtemp]=temp;
                --rtemp;
                ++ltemp;
            }
        }
        if(ltemp==rtemp){
            ltemp++;
        }
        if(left<rtemp){
            quickSort(arr,left,ltemp-1);               //递归调用
        }
        if(ltemp<right){
            quickSort(arr,rtemp+1,right);               //递归调用
        }
    }
}

发表回复

您的电子邮箱地址不会被公开。

A beliving heart is your magic My heart
欢迎来到Diuut的个人博客,这里是我的一些零零碎碎的知识汇总,希望有能帮到你的内容。 | 蜀ICP备2021011635号-1 | Copyright © 2024 Diuut. All Rights Reserved.