如何在插入排序中执行二进制搜索

时间:2015-01-29 04:21:21

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

我是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;
   }    
 }

2 个答案:

答案 0 :(得分:0)

二进制搜索可用于查找当前整数将插入已排序的先前元素数组中的索引。这可以使用二进制搜索来完成,该搜索搜索Key并返回索引值,使得 arr [i]&gt;密钥表示i的最低值。然后你可以通过移位使用普通插入排序方法插入位置i。

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

答案 1 :(得分:0)

如果我理解你的问题,那么你就会问如何在实现插入排序时使用binarySearch。

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

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;
    }
}

每次不扩展结果可以提高效率,但基本思路是一样的。

相关问题