2014-09-14 5 views
1

Я не могу найти, что случилось с моей сортировкой вставки. Мне нужно реализовать двоичный поиск в моем роде, и это не сработает.Вставка Сортировка с двоичным Serach

public void insertionSort(String[] data){ 
    for (int i=1; i<data.length; i++){ 
     String item = data[i]; 
     int move = binarySearch(data, item, 0, i - 1); 
     for (int j = i; j < move; j++){ 
      data[j] = data[j-1]; 
     } 
     data[move]= item; 
    } 
} 

public int binarySearch(String[] data, String item, int low, int high) { 
    int mid; 
    while(low<=high){ 
     mid=(low+high)/2; 
     if(item.compareTo(data[mid]) > 0) 
      low=mid+1; 
     else if(item.compareTo(data[mid]) < 0) 
      high=mid-1; 
     else 
      return mid; 
    } 
    return low; 
} 
+0

Обратите внимание, что вы можете использовать метод 'Arrays.binarySearch'. Если он возвращает отрицательное значение, просто возьмите противоположное, которое является индексом, в котором должен быть элемент, если массив содержал его. – Dici

+0

Проблема с частью двоичного поиска адресуется в http://stackoverflow.com/questions/16953009/implementing-a-binary-insertion-sort-using-binary-search-in-java –

ответ

3

Вступительный цикл неправильный. Поскольку move всегда будет находиться в диапазоне от 0 до i (включительно), то цикл будет начать с j >= move так что вам нужно декрементировать j, не увеличивать его:

for (int j = i; j > move; j--){ 
    data[j] = data[j-1]; 
} 
0

Ну, во-первых это не кажется полезным иметь в включить двоичный поиск в сортировку вставки. Двоичный поиск просто найдет позицию, в которой ваш ключ находится в вашем массиве данных. Сортировка вставки для данных [i] найдет позицию, в которой она принадлежит до i-го индекса.

В вашем for-loop для сортировки вставки вы должны декрементировать j вместо увеличения.

+2

Полезно, если вы имеют небольшое количество элементов, но сложная стоимость сравнения – nem035

Смежные вопросы