【问题标题】:How to perform Binary search in insertion sort如何在插入排序中执行二分查找
【发布时间】:2015-01-29 14:18:26
【问题描述】:

我是 java 的初学者,我一直在尝试执行插入排序,然后是二进制搜索。我已经使用随机不同的值执行了插入排序,我必须执行二进制搜索。我可以单独执行二进制搜索技术,但是如何使用特定值执行插入排序,然后使用插入排序中使用的相同值执行二进制搜索?

插入排序:

enter code here
/*
* To change this license header, choose License Headers in Project  
Properties.


* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package insertsort;

import java.util.Arrays;

/**
*
* @author Sriram
*/

public class InsertSort {

public static void main(String[] args) {
int A[] = new int[1000];
populateArray(A);
System.out.println("Before Sorting: ");
printArray(A);
// sort the array
insertSort(A);
System.out.println("\nAfter Sorting: ");
printArray(A);
}

/**
 * This method will sort the integer array using insertion sort algorithm
 * 
 * @param arr
 */
private static void insertSort(int[] arr) {
    for (int i = 1; i < arr.length; i++) {
        int valueToSort = arr[i];
        int j = i;
        while (j > 0 && arr[j - 1] > valueToSort) {
            arr[j] = arr[j - 1];
            j--;
        }
        arr[j] = valueToSort;
    }
}


public static void printArray(int[] B) {
    System.out.println(Arrays.toString(B));
}

public static void populateArray(int[] B) {
    for (int i = 0; i < B.length; i++) {
        B[i] = (int) (Math.random() * 1000);
    }
}
}

我已经分别进行了二分查找,如下:

enter code here
package binaryinsertionsort;

import java.util.Random;

/**
*
* @author Sriram
*/
public class Binaryinsertionsort {

public static void sort(int a[],int n){
    for (int i=0;i<n;++i){
        int cnt;
        int temp=a[i];
        int left=0;
        int right=i;
        while (left<right){
            int middle=(left+right)/2;
            if (temp>=a[middle])
                left=middle+1;
            else
                right=middle;
        }
        for (int j=i;j>left;--j){
            swap(a,j-1,j);
        }
      }
    }

     public static void main(String[] args){
     int a[]=new int[]{10,5,3,696,466,35,39,294,39,59,-21,45};
     sort(a,a.length);
     for (int i=0;i<a.length;i++){
     System.out.println(a[i]);
     }
   }
     public static void swap(int a[],int i,int j){
     int k=a[i];
     a[i]=a[j];
     a[j]=k;
   }    
 }

【问题讨论】:

  • 代码太多,哪里有问题?
  • 感谢您的回复,我只是发布了所有内容,以免造成混乱..我可以单独进行二进制搜索,我的问题是如何在插入排序技术中执行二进制搜索!!跨度>
  • 您的搜索代码在哪里?你如何将它与这个集成?

标签: java algorithm sorting binary-search insertion-sort


【解决方案1】:

二分查找可用于在已排序的先前元素数组中查找要插入当前整数的索引。这可以使用二进制搜索来完成,该搜索搜索 Key 并返回索引值,使得 arr[i] > Key 获得 i 的最低值。然后您可以通过移位使用正常的插入排序方法插入位置 i 。

注意:插入排序的时间复杂度仍然是使用移位方法确定的,即O(n),因此二分查找不会改变渐近复杂度O(n^2)。

【讨论】:

  • 我想为插入排序(第一个 prog)设置 1000 个不同的唯一值。当我为此使用插入排序时,重复存在(即:e)当我运行 30 个值的程序时可以看到不同的整数,但是当尝试 1000 时,值重复我该如何解决?
【解决方案2】:

如果我理解您的问题,那么您是在问如何使用 binarySearch 来实现插入排序。

Arrays.binarySearch 为例,如果找不到,它将返回索引中的位置以插入一个值。这允许相当简单的插入排序:

int[] insertInOrder(int value, int[] destination) {
    int foundIndex = Arrays.binarySearch(destination, value);
    if (foundIndex < 0) {
         int insertIndex = -foundIndex - 1;
         int[] result = Arrays.copyOf(destination, destination.length + 1);
         for (int i = result.length - 1; i > insertIndex; i--)
             result[i] = result[i-1];
         result[insertIndex] = value;
         return result;
    } else {
        return destination;
    }
}

这可以通过不每次都扩展结果来提高效率,但基本思想是相同的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    相关资源
    最近更新 更多