• 折半查找,折半排序,binary sort


    dataStruct

    图,数据结构

    /**
    折半查找,折半排序,binary sort
    */

    private StorageA circular_shiftsB_;        //original data
    private StorageA alphabetizedB_;        //sorted data
    public void alphabetizing() {
        alphabetizedB_ = new StorageA();
        int alphabetized_count = 0;

        // we use binary search to find the proper place
        // to insert a line,
        // declare variables for binary search
        int low = 0;
        int high = 0;
        int mid = 0;

        // process the circular shifts
        for (int i = 0; i < circular_shiftsB_.indexs_.size(); i++) {

            // current shift array
            String current_shiftB = null;

            // get current_shiftB
            if (i == circular_shiftsB_.indexs_.size() - 1) {
                current_shiftB = new String(circular_shiftsB_.chars_
                        .substring(circular_shiftsB_.indexs_.get(i)));
            } else {
                current_shiftB = circular_shiftsB_.chars_.substring(
                        circular_shiftsB_.indexs_.get(i),
                        circular_shiftsB_.indexs_.get(i + 1));
            }

            // binary search to the right place to insert
            // the i-th line
            low = 0;
            high = alphabetized_count - 1;
            while (low <= high) {
                // find the mid line
                mid = (low + high) / 2;

                String mid_lineB = null;
                // get mid_lineB
                if (mid == alphabetizedB_.indexs_.size() - 1) {
                    mid_lineB = new String(alphabetizedB_.chars_
                            .substring(alphabetizedB_.indexs_.get(mid)));
                } else {
                    mid_lineB = new String(alphabetizedB_.chars_.substring(
                            alphabetizedB_.indexs_.get(mid),
                            alphabetizedB_.indexs_.get(mid + 1)));
                }

                // find the smaller number of characters between mid and current
                // shift
                int length = (current_shiftB.length() < mid_lineB.length()) ? current_shiftB
                        .length()
                        : mid_lineB.length();

                // comparison flag
                // if two lines are identical: compared = 0
                // if the first line is greater than the second one: compared =
                // 1
                // if the first line is smaller than the second one: compared =
                // -1
                int compared = 0;

                // compare the lines alphabetically
                // comparision is case sensitive, i.e., upper cases are
                // considered
                // greater than lower cases
                for (int j = 0; j < length; j++) {
                    if (current_shiftB.charAt(j) > mid_lineB.charAt(j)) {
                        compared = 1;
                        break;
                    } else if (current_shiftB.charAt(j) < mid_lineB.charAt(j)) {
                        compared = -1;
                        break;
                    }
                }

                // if compared == 0 check if the lines have the equal length
                // the line that has greater length is greater than the other
                // line
                if (compared == 0) {
                    if (current_shiftB.length() < mid_lineB.length())
                        compared = -1;
                    else if (current_shiftB.length() > mid_lineB.length())
                        compared = 1;
                }

                switch (compared) {
                case 1: // i-th line greater
                    low = mid + 1;
                    break;
                case -1: // i-th line smaller
                    high = mid - 1;
                    break;
                default: // i-th line equal
                    low = mid;
                    high = mid - 1;
                    break;
                }
            }

            // alphabetizedB_.chars_.insert(offset, str)
            // alphabetizedB_.indexs_.add(alphabetizedB_.chars_.length())
            if (alphabetizedB_.indexs_.size() == 0) {
                alphabetizedB_.indexs_.add(0);
                alphabetizedB_.chars_.append(current_shiftB);
            } else {
                if (low > alphabetizedB_.indexs_.size() - 1) {
                    alphabetizedB_.indexs_.add(alphabetizedB_.chars_.length());
                    alphabetizedB_.chars_.append(current_shiftB);
                } else {
                    alphabetizedB_.chars_.insert(alphabetizedB_.indexs_
                            .get(low), current_shiftB);
                    alphabetizedB_.indexs_.add(0);

                    for (int k = alphabetizedB_.indexs_.size() - 1; k > low; k--) {
                        alphabetizedB_.indexs_.set(k, alphabetizedB_.indexs_
                                .get(k - 1)
                                + current_shiftB.length());
                    }
                }
            }

            // increment the count of alphabetized shifted lines
            alphabetized_count++;
        }
    }

  • 相关阅读:
    数据库中Schema(模式)概念的理解
    debug --- 使用Eclipse
    pgsql 相关函数
    浏览器显示页面排版错误
    jqury 属性
    节点互换需要克隆
    mysql数据库允许远程访问
    request与response的编码和解码
    文本和属性 radio,checkbox,select
    js 和 JQuery 获取iframe的父子值
  • 原文地址:https://www.cnblogs.com/linc09/p/2005889.html
Copyright © 2020-2023  润新知