java - 二分查找和插入排序

标签 java algorithm sorting recursion

我的 insertInOrder 方法是错误的(它向后打印数字列表)。我正在读取一个数字列表,我想使用插入排序算法使用二进制搜索的索引位置按升序对数字进行排序。我不太确定如何解决这个问题,非常感谢您的帮助。

static void insertInOrder( int[] arr, int cnt, int newVal ) {

    int index = bSearch( arr, 0, arr.length-1, newVal) ;
    if (index < 0) {
        index  = -1 - index ;
    }
    for ( int i = cnt; i >= index+1 ; --i) {
       arr[i] = arr[i-1];
    }

    arr[index] = newVal;
}


public static int bSearch(int[] a, int lo, int hi, int key) {
    int mid = (lo+hi)/2;
    if(lo>hi)
        return -1;
    else if (a[mid]==key)
        return mid;
    else if (a[mid]<key)
        return bSearch(a, mid+1, hi, key);
    else
        return bSearch(a, lo, mid-1, key);
}

Reading in: 5 13 7 9 21
Current Output: 21 9 7 13 5
Desired Output: 5 7 9 13 21

这是我的 insertInOrder

    int[] arr = new int[INITIAL_CAP];
    int arrCnt= 0;
    while (infile.hasNextInt())
    {
        if ( arrCnt==arr.length )
            arr = doubleMyLength(arr);
        insertInOrder( arr, arrCnt, infile.nextInt() );
        ++arrCnt;
    }
    infile.close();

    arr = trimMyLength( arr, arrCnt );
    System.out.println("Sorted array of " + arr.length + " ints from " + args[0] + " after insert in order:" );
    printArray( arr );  // we trimmed it so count == length so we don't bother to pass in count

最佳答案

当在数组中找不到 newVal 时(这很可能发生),您的 bSearch() 返回 -1。然后,insertInOrder() 始终将项目插入到位置 index = -1 - index,即 0。这就是结果错误的原因。

要使其正确,您的 bSearch() 需要返回值大于 newVal 的最小索引。

关于java - 二分查找和插入排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22109227/

相关文章:

java - 在 java 浏览透视图中使用控制台 View 时出现 Eclipse Juno 错误

algorithm - 在无向图中查找所有唯一路径

algorithm - 如何使用我自己选择的数据透视表(逐步)对这些数据进行快速排序

javascript - 在 Immutable.js 中按特定键对orderedMap 进行排序

javascript - 为什么在这种情况下排序会修改原始内容?

java - 如何获取两个特定字符串之间的文本

java - 检查长度时用户名正则表达式不起作用

java - 从 IntelliJ 运行 Jetty 时找不到模块 [protonego-impl/alpn-1.8.0_45]

algorithm - 从列表中选择 N 个位置以最大化总和,并具有最小距离约束

c++ - 如何订购具有重复值的数组?