亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

Java 位圖法排序的使用方法

2019-11-26 16:11:50
字體:
來源:轉載
供稿:網友

java JDK里面容器類的排序算法使用的主要是插入排序和歸并排序,可能不同版本的實現有所不同,關鍵代碼如下:

復制代碼 代碼如下:

/**
     * Performs a sort on the section of the array between the given indices
     * using a mergesort with exponential search algorithm (in which the merge
     * is performed by exponential search). n*log(n) performance is guaranteed
     * and in the average case it will be faster then any mergesort in which the
     * merge is performed by linear search.
     *
     * @param in -
     *            the array for sorting.
     * @param out -
     *            the result, sorted array.
     * @param start
     *            the start index
     * @param end
     *            the end index + 1
     */
    @SuppressWarnings("unchecked")
    private static void mergeSort(Object[] in, Object[] out, int start,
            int end) {
        int len = end - start;
        // use insertion sort for small arrays
        if (len <= SIMPLE_LENGTH) {
            for (int i = start + 1; i < end; i++) {
                Comparable<Object> current = (Comparable<Object>) out[i];
                Object prev = out[i - 1];
                if (current.compareTo(prev) < 0) {
                    int j = i;
                    do {
                        out[j--] = prev;
                    } while (j > start
                            && current.compareTo(prev = out[j - 1]) < 0);
                    out[j] = current;
                }
            }
            return;
        }
        int med = (end + start) >>> 1;
        mergeSort(out, in, start, med);
        mergeSort(out, in, med, end);

        // merging

        // if arrays are already sorted - no merge
        if (((Comparable<Object>) in[med - 1]).compareTo(in[med]) <= 0) {
            System.arraycopy(in, start, out, start, len);
            return;
        }
        int r = med, i = start;

        // use merging with exponential search
        do {
            Comparable<Object> fromVal = (Comparable<Object>) in[start];
            Comparable<Object> rVal = (Comparable<Object>) in[r];
            if (fromVal.compareTo(rVal) <= 0) {
                int l_1 = find(in, rVal, -1, start + 1, med - 1);
                int toCopy = l_1 - start + 1;
                System.arraycopy(in, start, out, i, toCopy);
                i += toCopy;
                out[i++] = rVal;
                r++;
                start = l_1 + 1;
            } else {
                int r_1 = find(in, fromVal, 0, r + 1, end - 1);
                int toCopy = r_1 - r + 1;
                System.arraycopy(in, r, out, i, toCopy);
                i += toCopy;
                out[i++] = fromVal;
                start++;
                r = r_1 + 1;
            }
        } while ((end - r) > 0 && (med - start) > 0);

        // copy rest of array
        if ((end - r) <= 0) {
            System.arraycopy(in, start, out, i, med - start);
        } else {
            System.arraycopy(in, r, out, i, end - r);
        }
    }


看到編程珠璣上有一個很有趣的排序算法-位圖法其思想是用1位來表示[0~n-1]中的整數是否存在。1表示存在,0表示不存在。即將正整數映射到bit集合中,每一個bit代表其映射的正整數是否存在。

比如{1,2,3,5,8,13}使用下列集合表示:

  0 1 1 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0

偽代碼如下:

for (i  in  [0~n-1])  bit[i] = 0;
for(i  in [0~n-1])
  if (i in input file)     
    bit[i] = 1

for(i  in [0~n-1])
  if(bit[i] == 1) 
    output i

用java 代碼嘗試下,效率果然不錯:

復制代碼 代碼如下:

public class javaUniqueSort {
    public static int[] temp = new int[1000001];
    public static List<Integer> tempList = new ArrayList<Integer>();
    public static int count;

    public static void main(final String[] args) {
        List<Integer> firstNum = new ArrayList<Integer>();
        List<Integer> secondNum = new ArrayList<Integer>();

        for (int i = 1; i <= 1000000; i++) {
            firstNum.add(i);
            secondNum.add(i);
        }

        Collections.shuffle(firstNum);
        Collections.shuffle(secondNum);

        getStartTime();
        Collections.sort(firstNum);
        getEndTime("java sort run time  ");

        getStartTime();
        secondNum = uniqueSort(secondNum);
        getEndTime("uniqueSort run time ");

    }

    public static List<Integer> uniqueSort(final List<Integer> uniqueList) {
        javaUniqueSort.tempList.clear();
        for (int i = 0; i < javaUniqueSort.temp.length; i++) {
            javaUniqueSort.temp[i] = 0;
        }
        for (int i = 0; i < uniqueList.size(); i++) {
            javaUniqueSort.temp[uniqueList.get(i)] = 1;
        }
        for (int i = 0; i < javaUniqueSort.temp.length; i++) {
            if (javaUniqueSort.temp[i] == 1) {
                javaUniqueSort.tempList.add(i);
            }
        }

        return javaUniqueSort.tempList;
    }

    public static void getStartTime() {
        javaShuffle.start = System.nanoTime();
    }

    public static void getEndTime(final String s) {
        javaShuffle.end = System.nanoTime();
        System.out.println(s + ": " + (javaShuffle.end - javaShuffle.start) + "ns");
    }
}

運行時間:

java sort run time  : 1257737334ns
uniqueSort run time : 170228290ns
java sort run time  : 1202749828ns
uniqueSort run time : 169327770ns


如果有重復數據,可以修改下:
復制代碼 代碼如下:

public class javaDuplicateSort {
    public static List<Integer> tempList = new ArrayList<Integer>();
    public static int count;

    public static void main(final String[] args) {
        Random random = new Random();
        List<Integer> firstNum = new ArrayList<Integer>();
        List<Integer> secondNum = new ArrayList<Integer>();

        for (int i = 1; i <= 100000; i++) {
            firstNum.add(i);
            secondNum.add(i);
            firstNum.add(random.nextInt(i + 1));
            secondNum.add(random.nextInt(i + 1));
        }
        Collections.shuffle(firstNum);
        Collections.shuffle(secondNum);

        getStartTime();
        Collections.sort(firstNum);
        getEndTime("java sort run time  ");

        getStartTime();
        secondNum = uniqueSort(secondNum);
        getEndTime("uniqueSort run time ");

    }

    public static List<Integer> uniqueSort(final List<Integer> uniqueList) {
        javaDuplicateSort.tempList.clear();
        int[] temp = new int[200002];
        for (int i = 0; i < temp.length; i++) {
            temp[i] = 0;
        }
        for (int i = 0; i < uniqueList.size(); i++) {
            temp[uniqueList.get(i)]++;
        }
        for (int i = 0; i < temp.length; i++) {
            for (int j = temp[i]; j > 0; j--) {
                javaDuplicateSort.tempList.add(i);
            }
        }

        return javaDuplicateSort.tempList;
    }

    public static void getStartTime() {
        javaShuffle.start = System.nanoTime();
    }

    public static void getEndTime(final String s) {
        javaShuffle.end = System.nanoTime();
        System.out.println(s + ": " + (javaShuffle.end - javaShuffle.start) + "ns");
    }
}


這種算法還是有很明顯的局限性的,比如說要知道數據中最大的數值,更重要的是數據的疏密程度,比如說最大值為1000000而要數組大小只有100,那么效率會下降的非常明顯。。。。。但是,使用位圖法進行排序,確實讓人眼前一亮。位圖法通常是用來存儲數據,判斷某個數據存不存在或者判斷數組是否存在重復 。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美成年人在线观看| 热久久免费视频精品| 国产精品福利久久久| 亚洲另类图片色| 成人国内精品久久久久一区| 97在线视频国产| 中文字幕日韩电影| 日韩中文字幕在线精品| 久久精品视频在线| 九九热精品视频在线播放| 爱福利视频一区| 久久高清视频免费| 伊人久久久久久久久久久| 亚洲高清一二三区| 欧美激情影音先锋| 久久久久久一区二区三区| 成人免费视频97| 亚洲国产欧美精品| 久久偷看各类女兵18女厕嘘嘘| 成人欧美一区二区三区在线湿哒哒| 欧美激情精品久久久久久| 日韩在线观看网址| 久久91精品国产91久久跳| 久久久免费观看| 欧美精品电影在线| 日韩中文字幕不卡视频| 国产成人免费av电影| 亚洲白虎美女被爆操| 国产精品久久久久久av福利| 国产91精品久久久久| 久久精品国产视频| 亚洲精品美女网站| 欧美一性一乱一交一视频| 中文字幕在线日韩| 久久免费福利视频| www国产精品com| 国产成人激情小视频| 欧美日韩成人黄色| 国产精品专区h在线观看| 色狠狠久久aa北条麻妃| 日本免费一区二区三区视频观看| 欧美在线观看www| 欧美激情视频一区二区| 国产精品国产福利国产秒拍| 日韩av日韩在线观看| 人妖精品videosex性欧美| 久久精品国产亚洲精品2020| 亚洲欧美资源在线| 亚洲成人a级网| 一色桃子一区二区| 精品毛片网大全| 亚洲欧美日韩一区在线| 亚洲激情第一页| 国产精品视频精品视频| 久久久精品国产一区二区| 日韩中文av在线| 久久99精品久久久久久青青91| 第一福利永久视频精品| 97精品伊人久久久大香线蕉| 亚洲精品国产精品久久清纯直播| 国产视频在线一区二区| 日韩精品免费在线| 韩国v欧美v日本v亚洲| 久久国产精品久久久久久久久久| 亚洲第一精品电影| 福利精品视频在线| 亚洲伊人久久大香线蕉av| 亚洲人在线视频| 91在线观看免费高清完整版在线观看| 日韩中文字幕在线视频播放| 欧美一级电影免费在线观看| 在线日韩精品视频| 国产一区香蕉久久| 亚洲成人av片在线观看| 亚洲人成网站在线播| 亚州精品天堂中文字幕| 在线观看精品自拍私拍| 日产精品99久久久久久| 国产成人精品一区二区| 国产精品精品久久久| 成人国产精品一区二区| 国产精品日韩在线| 成人情趣片在线观看免费| 怡红院精品视频| 亚洲成人网在线观看| 亚洲已满18点击进入在线看片| 91色p视频在线| 亚洲毛片在线观看.| 久久综合色影院| 国产亚洲精品美女| 97视频免费观看| 国产精品白丝jk喷水视频一区| 日韩美女av在线免费观看| 亚洲精品小视频在线观看| 日本成人免费在线| 亚洲福利在线播放| 久久偷看各类女兵18女厕嘘嘘| 欧美精品在线播放| 26uuu日韩精品一区二区| 久久中文精品视频| 国产999精品久久久影片官网| 精品久久久久久久久久ntr影视| 欧美高清不卡在线| 国产女精品视频网站免费| 国产精品成人国产乱一区| 亚洲第一福利在线观看| 欧美老女人性生活| 青青草精品毛片| 欧美成人精品在线| 欧美在线一级视频| 2018中文字幕一区二区三区| 精品在线观看国产| 91成人精品网站| 狠狠色狠狠色综合日日五| 欧美黄色片在线观看| 欧美成人免费va影院高清| 久久亚洲精品一区| 亚洲精品xxx| 国产精品欧美风情| 亚洲人成人99网站| 欧美小视频在线观看| 午夜精品久久久久久久久久久久久| 国产精品狼人色视频一区| 国产精品入口夜色视频大尺度| 日韩美女在线播放| 57pao国产精品一区| 91沈先生在线观看| 97视频在线观看免费高清完整版在线观看| 国产精品v片在线观看不卡| 欧美性在线观看| 91精品视频观看| 亚洲成人av片在线观看| 这里只有精品久久| 91在线中文字幕| 欧美在线www| 亚洲jizzjizz日本少妇| 亲爱的老师9免费观看全集电视剧| 欧美刺激性大交免费视频| 欧美怡红院视频一区二区三区| 日本久久久久久久| 在线国产精品播放| 在线精品高清中文字幕| 国产日韩中文在线| 亚洲人成亚洲人成在线观看| 最近2019年好看中文字幕视频| 色小说视频一区| 亚洲女在线观看| 成人精品福利视频| 日韩av影院在线观看| 在线观看91久久久久久| 亚洲最大福利网站| 91免费版网站入口| 久热精品在线视频| 亚洲毛片在线免费观看| 欧美性感美女h网站在线观看免费| 777777777亚洲妇女| 日本欧美在线视频| 亚洲第一男人av| 91精品91久久久久久| 久热精品视频在线观看一区| 在线看片第一页欧美| 久久久av亚洲男天堂| 亚洲毛片一区二区| 久久99久久99精品中文字幕|