2013-11-14 2 views
0

Я пытаюсь создать сортировку пузыря, используя while. Я разместил свой класс ниже. Почему в сортировке последний int из 9 не отображается.Пузырь сортировки, используя цикл. Последний вид, отсутствующий в выходе

namespace BubbleSort { 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      int[] i = {9, 2, 7, 6, 1, 3, 5, 4, 8}; 
      int va = 0, vb = 0; 

      //loop through all numbers in the array. 
      while (va < i.Length) 
      { 
       //loop through all numbers in the array trailing the first loop by 1. 
       while (vb < i.Length) 
       { 
        //compare the two values. 
        if (i[vb] < i[va]) { 
         Console.WriteLine(vb); 
        }      
        vb++; //increment 
       }     
       va++; //increment 
      } 
      Console.ReadLine(); 
     } 
    } 
} 

Правильно ли этот подход?

+0

Хотите ли вы использовать сортировку пузырьков по определенной причине? Почему бы не просто i.OrderBy (x => x); –

+0

Thats not bubble sort, дополнительно вы выводите индекс, а не значение. Сортировка Bubble включает в себя несколько проходов. –

+0

i.Length равно 9, вы увеличиваете объем печати vb, в то время как это меньше, чем i.Length, поэтому вы никогда не будете распечатывать 9. – Jonny

ответ

1

Нет, это не сортировка пузырьков, кроме того, вы выводите индекс массива, а не значение. См Wikipedia Ф.О. с объяснений

Вы хотите что-то подобное:

int[] i = {9, 2, 7, 6, 1, 3, 5, 4, 8}; 
    int va = 0; 

    bool swapped = true; 

    while (swapped) { 

    swapped=false; 
    va = 0; 
    //loop through all numbers in the array. 
    while (va < i.Length -1) 
    { 
      //compare the two values. 
      if (i[va] > i[va+1]) { 

       int swap = i[va]; 
       i[va] = i[va+1]; 
       i[va+1] = swap; 
       swapped=true; 
      } 

     //increment 
     va++; 
    } 
} 

Тогда i будут отсортированы.

Btw это субоптимальное, вы можете использовать п-й оптимизацию частот и для петель для лучшего алгоритма

Более оптимизированная версия с циклом может быть

int[] i = {9, 2, 7, 6, 1, 3, 5, 4, 8}; 

int n = i.Length -1; 
bool swapped = true; 

for (int n = i.Length - 1; swapped && n > 0; n--) { 
    swapped = false; 
    for (int va=0; va < n; va++) { 
     if (i[va] > i[va+1]) { 
      int swap = i[va]; 
      i[va] = i[va+1]; 
      i[va+1] = swap; 
      swapped=true; 
     } 
    } 
} 
1

Нет, его нет.

1) Нарушение принципа «S»: класс, который реализует сортировку bobble, не должен записываться на консоль.

http://es.wikipedia.org/wiki/SOLID_(object-oriented_design)

2) Ваш вложенный в то время как цикл печатает только некоторые цифры, это ничего не сортировать вообще.

http://en.wikipedia.org/wiki/Bubble_sort

0

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

Чтобы ответить на ваш вопрос:

i[vb] < i[va] 

я [0] является 9. Это никогда меньше любой из ваших записей, так что это никогда не распечатана.

EDIT

Данг, да. Отпечатывается индекс . Интересно, я не вижу, чтобы vb был сброшен в любое время до 0 ?? Ну, допустим, я в замешательстве, почему кто-то может подумать, что это алгоритм сортировки :)

+0

На самом деле 9 никогда не печатается, потому что в массиве всего 8 других записей. Если вы заполнили массив тремя нулями, вы получите 9, 10 и 11 в выводе. –

+0

О том, что действительно был напечатан _index_. – oerkelens

2

Короче говоря, нет. Вы на самом деле ничего не сортируете.Вот что происходит в вашем коде:

  • Вы устанавливаете va и vb к нулю и введите ваши два while петли
  • Первая итерация внутреннего цикла сопостовительное i[0] для каждого значения в массиве
  • i[vb] < i[va] возвращает false для vb == 0 (потому что 9 не менее 9) так ничего не отображено
  • vb - прирост
  • завершается оставшаяся часть внутренней петли. Так как каждое другое значение в массиве равно меньше 9, все они выдают значение, но вы фактически выставляете значение vb НЕ значение из массива. Ваша петля идет от 0 до 8, и вы пропускаете первое значение, потому что оно самое высокое в массиве - поэтому вы выводите числа 1 в 8 во внутренний цикл.
  • внутренний цикл завершается с шагом по внешнему контуру vb набора в 9
  • va и повторяет
  • vb по-прежнему установлены в 9 и поэтому внутренний цикле полностью пропускается
  • вышеупомянутых два шага повторять до va течения 9, после чего код завершается.

Если вы используете в качестве своего входа другой массив, вы увидите, что получаете совершенно другой результат. Например, если вы удалите 9 из передней части массива, вы получите только 3 как результат (потому что только i[3] меньше первого значения 2). Если вы поместите свой массив с тремя нулевыми значениями, вы фактически получите 9, 10 и 11 в выводе, потому что вы выводите значение счетчика/индекса вместо фактического отсортированного значения.

0
public static void BubbleSort(int[] arr) 
{ 
    for (int i = 0 ; i < arr.Length; i++) 
    { 
     for (int j = i + 1 ; j< arr.Length; j++) 
     { 
      if (arr[i] > arr[j]) 
      { 
       int tmp = arr[i]; 
       arr[i] = arr[j]; 
       arr[j] = tmp; 
      } 
     } 
    } 

    Console.WriteLine(String.Join(", ", arr)); 
} 
+0

Разве это не вариация выбора, а не пузырь? –

+0

Возможно, прошло 10 лет с тех пор, как я написал алгоритмы сортировки :) –

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