排序-快速排序-优化-基准值选择待排序数组的三个等距取样的中位数

来源:互联网 发布:遥知不是雪是哪首诗 编辑:程序博客网 时间:2024/05/18 03:47
package xwq.sort;import xwq.util.In;import xwq.util.StdOut;/** * 使用三取样partition优化QuickSort */public class QuickSortMid {    public static void sort(int a[]) {        partition(a,0,a.length-1);    }    //划分    private static void partition(int a[],int low,int high) {        if(low >= high)            return;        int N = high - low + 1;        //抽取三个等距离的数,选择其中中位数作为基准值        if(N > 40) {            int len = N/8;            int mid = low+N/2;            int m1 = median3(a,low,low+len,low+len+len);             int m2 = median3(a,mid-len,mid,mid+len);            int m3 = median3(a,high-len-len,high-len,high);            int m = median3(a,m1,m2,m3);        }        else if(N >=3) {            int m = median3(a,low,low+N/2,high);            swap(a,low,m);        }        int pivot = a[low];        int l = low,h = high;        while( l < h) {            while(l<h && a[h]>=pivot) h--;            if(l<h) swap(a,l++,h);            while(l<h && a[l]<=pivot) l++;            if(l<h) swap(a,l,h--);        }        a[l] = pivot;        partition(a,low,l-1);        partition(a,l+1,high);    }    /*     * 返回3个数的中位数     */    private static int median3(int a[],int low,int mid,int high) {        if(a[low] > a[mid] && a[low] < a[high])            return low;        if(a[low] > a[mid] && a[mid] < a[high])            return mid;        return high;    }    private static void swap(int a[],int i,int j) {        int t = a[i]; a[i] = a[j]; a[j] = t;    }    public static void print(int a[]) {        for (int i = 0; i < a.length; i++)            StdOut.print(a[i] + " ");        StdOut.println();    }    // 测试函数    public static void main(String[] args) {        int[] a = In.readInts(args[0]);        sort(a);        print(a);    }}
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 3岁幼儿睡眠不好怎么办 2岁幼儿睡眠不好怎么办 2岁宝宝睡眠不好怎么办 9岁儿童睡眠不好怎么办 3岁宝宝老踢被子怎么办 4岁宝宝老踢被子怎么办 四线锁边机跳线怎么办 引流管伤口洞红怎么办 甘蔗卡在喉咙里怎么办 棉花被子生虫了怎么办 绗缝羽绒服钻毛怎么办 宝珠笔没墨水了怎么办 衣服上画的笔印怎么办 黑笔芯弄衣服上怎么办 圆珠笔油在皮上怎么办 不小心吞了水银怎么办 小孩吃了洗发露怎么办? 脸上被铅笔戳了怎么办 小孩吃了铅笔芯怎么办 小孩把橡皮吃了怎么办 用棉签掏耳朵里面疼怎么办 棉签头掉耳朵里怎么办 黑裤子老是粘毛怎么办 新买的裤子掉色怎么办 黑裤子容易粘毛怎么办 裤子粘了全部毛怎么办 纯棉裤子粘毛了怎么办 裤子粘毛怎么办怎么洗 黑裤子洗白了怎么办 新买床单有味道怎么办 新买的床单扎人怎么办 刚买的衣服皱了怎么办 橘子沾到衣服上怎么办 橘子水掉衣服上怎么办 菜汁滴在衣服上怎么办 饺子面和硬了怎么办 化纤衣服烫亮了怎么办 衣服穿久了发亮怎么办 买的毛衣长了怎么办 买的毛衣袖子长怎么办 新买的毛衣扎人怎么办