2014-10-05 4 views
1

Задача состояла в том, чтобы модифицировать сортировку пузырьков так, чтобы она была двунаправленной.Модифицированный тип пузырьков, но не работает правильно

Это означает, что индекс «in» будет нести самый большой элемент слева направо, но когда он достигнет «out», он будет реверсировать и нести наименьший элемент справа налево.

Метод bubbleSort() - это обычный способ, который был представлен в примере.

Мой код в способе bidiBubbleSort().

По какой-то причине, когда я запускал программу, он дал мне результат, который был отсортирован, но не правильно.

Я вручную сделал каждый шаг на куске бумаги с карандашом, но я не знаю, что я пропускаю.

Несортиров: 7 6 5 4 3 2 1

и

Сортировка: 6 4 2 1 3 5 7

class ArrayBub 
{ 
    private long[] a;       // ref to array a 
    private int nElems;       // number of data items 
// -------------------------------------------------------------- 
    public ArrayBub(int max)      // constructor 
    { 
     a = new long[max];      // create the array 
     nElems = 0;        // no items yet 
    } 
// -------------------------------------------------------------- 
    public void insert(long value)    // put element into array 
    { 
     a[nElems] = value;      // insert it 
     nElems++;         // increment size 
    } 
// -------------------------------------------------------------- 
    public void display()      // displays array contents 
    { 
     for(int j=0; j<nElems; j++)    // for each element, 
     System.out.print(a[j] + " ");   // display it 
     System.out.println(""); 
    } 
// Beginning of my code ------------------------------------------------------- 
    public void bidiBubbleSort() 
    { 
     int out, x, y; 
     int in = 0; 

     for(x=0, out=nElems-1; out>x; out--, x++) // outer loop (backward) 
     for(in=x; in<out+1; in++)    // inner loop (forward) 
      if(in<out) 
       if(a[in] > a[in+1])   // out of order? 
        swap(in, in+1);    // swap them 
       else        // (in==out) 
        for(y=out-1; y>x; y--)  // reverse 
        if(a[y] < a[y-1]) 
         swap(y, y-1); 
    } 
// End of my code ------------------------------------------------------------- 
    public void bubbleSort() 
    { 
     int out, in; 

     for(out=nElems-1; out>1; out--)   // outer loop (backward) 
     for(in=0; in<out; in++)     // inner loop (forward) 
      if(a[in] > a[in+1])    // out of order? 
       swap(in, in+1);     // swap them 
    }            // end bubbleSort() 

    private void swap(int one, int two) 
    { 
     long temp = a[one]; 
     a[one] = a[two]; 
     a[two] = temp; 
    } 
// -------------------------------------------------------------- 
}            // end class ArrayBub 

class BubbleSortApp 
{ 
    public static void main(String[] args) 
     { 
     int maxSize = 100;      // array size 
     ArrayBub arr;        // reference to array 
     arr = new ArrayBub(maxSize);    // create the array 

     arr.insert(7);       // insert 7 items 
     arr.insert(6); 
     arr.insert(5); 
     arr.insert(4); 
     arr.insert(3); 
     arr.insert(2); 
     arr.insert(1); 

     arr.display();       // display items 

     arr.bidiBubbleSort();      // bidirectional bubble sort 

     arr.display();       // display them again 
     }           // end main() 
}            // end class BubbleSortApp 

ответ

0

Основная цель двунаправленная сортировка пузыря или сортировка коктейлей - решить проблему наименьших значений (иначе черепах) в конце несортированный список, чтобы перейти к началу списка быстрее, чем обычная сортировка пузырьков.

Помня об этой цели, вам нужно понять разновидности двунаправленных пузырьков с обоих концов. т.е. Начало списка, В конец списка каждые.

Ваша нынешняя реализация, похоже, безуспешно настраивает обычную сортировку пузырьков. Мой совет должен был забыть о реализации вида и кода пузыря с вышеуказанной целью w.r.to bubble.

Чтобы начать Вас, ниже намек:

Определите выход вашего внешнего контура динамически с условием, чтобы проверить , если список был отсортирован или нет. Не полагайтесь на счетчик на внешнем цикле , как это делает обычная сортировка пузырьков.

Если вы все еще не можете решить проблему, загляните в статью по Википедии, а затем выполните: http://en.wikipedia.org/wiki/Cocktail_sort. Посмотрите на него, если вы не можете его решить!