排序-快速排序之随机选取基准法

思想:基本的快速排序选取第一个或者最后一个元素作为基准。这样在数组已经有序的情况下,每次划分将得到最坏的结果。一种比较常见的优化方法是随机化算法,即随机选取一个元素作为基准。这种情况下虽然最坏情况仍然是O(n2),但最坏情况不再依赖于输入数据,而是由于随机函数取值不佳。实际上,随机化快速排序得到理论最坏情况的可能性仅为1/(2n)。所以随机化快速排序可以对于绝大多数输入数据达到O(nlogn)的期望时间复杂度。
/**
 * @Author BoYou
 * @Description 随机选取的快排
 * @Date 2019/1/10 0010
 */
public class FastSort03 {
    public static void main(String[] args) {
        Random ran=new Random();
        int[] array=new int[100];
        for (int i = 0; i <100 ; i++) {
            array[i] = ran.nextInt(100)+1;
        }
        quicksort(array);
        System.out.println(Arrays.toString(array));
    }
    public static void quicksort(int[] array){
        quick(array,0,array.length-1);
    }
    public static void quick(int[] array,int low,int high){
        Random ran=new Random();
        int sc=ran.nextInt(high-low)+1+low;
        swap(array,sc,low);
        int par=parvion(array,low,high);
        if (par>low+1){
            quick(array,low,par-1);
        }
        if (par<high-1){
            quick(array,par+1,high);
        }

    }
    public static void swap(int[] array,int a,int b){
        int tmp=array[a];
        array[a]=array[b];
        array[b]=tmp;
    }

    public static int parvion(int[] array,int low,int high){
        int tmp=array[low];
        while (low<high){
            while (low<high&&tmp<array[high]){
                high--;
            }
            if (low<high){
                array[low]=array[high];
                low++;
            }else break;

            while (low<high&&tmp>array[low]){
                low++;
            }
            if (low<high){
                array[high]=array[low];
                high--;
            }else break;
        }

        array[low]=tmp;
        return low;
    }


}

猜你喜欢

转载自blog.csdn.net/qq_39602004/article/details/87902089