2012-05-26 2 views
1

У меня есть массив из 10 int и с использованием сортировки выбора. Я вычисляю, что для сортировки всего массива требуется около 45 сравнений, но я не уверен, сколько нужно сортировать по методу слияния по моим расчетам, требуется 12 сравнений .... я прав или не прав здесь?сравнение с использованием сортировки слияния и выбора сортировки

Заранее спасибо

вот метод слияния

static void merge(int[] first, int[] second, int[] a) 
    { 
     int iFirst = 0; 
     int iSecond = 0; 
     int i = 0; 
     //moving the smaller element into a 
     while(iFirst < first.length && iSecond < second.length) 
     { 
      if(first[iFirst] < second[iSecond]) 
      { 
       a[i] = first[iFirst]; 
       iFirst++; 
      } 
      else 
      { 
       a[i] = second[iSecond]; 
       iSecond++; 
      } 
      i++;    
     } 
     counter += i; 

     //copying the remaning of the first array 
     while(iFirst < first.length) 
     { 
      a[i] = first[iFirst]; 
      iFirst++; i++; 
     } 
     //copying the remaining of second array 
     while(iSecond < second.length) 
     { 
      a[i] = second[iSecond]; 
      iSecond++; i++; 
     }   
    } 

ответ

3

Слить в n -элементного массива с m элементного массива, вам необходимы n+m-1 сравнений в худшем случае (min{m,n} в лучшем случае) ,

Поэтому, когда вы разбиваете массив из 10 элементов пополам, слияние верхнего уровня требует до 9 сравнений. Для двух пятиэлементных половин требуется до 4 сравнений, 9 + 2*4 = 17. Разделение пятиэлементных половин в 2-элементной и трехэлементной части требует до 1 + 3 сравнений, поэтому общим худшим случаем будет 25 сравнений (9 + 2 * 4 + 2 * 3 + 2 * 1).

   10(9)        9 
      / \ 
      /  \ 
      /  \ 
      /   \ 
     /   \ 
     /    \ 
     /    \ 
     5(4)    5(4)     8 
    / \   / \ 
    / \   / \ 
    3(2)  2(1)  3(2)  2(1)    6 
/ \ / \ / \ / \ 
    2(1) 1 1  1 2(1) 1 1  1    2 
/ \   / \ 
1  1   1  1 
+0

Что вы подразумеваете под наихудшим случаем, в конце вам все равно нужно сравнить все числа, не так ли? – miatech

+0

Не обязательно. Если вы объедините '[1,2,3,4,5]' с '[6,7,8,9,10]', вам нужно только сравнить 6 с пятью элементами первого массива, после чего, больше никаких сравнений не требуется. Если самый большой элемент одного из отсортированных массивов (более короткий) для слияния меньше, чем самый маленький из других, это лучший случай. Таким образом, для слияния требуется что-либо от 'min {m, n}' до 'm + n-1'. Дерево в моем ответе дает наихудшие номера. –

+0

ОК, вот что я делаю, я пытаюсь подсчитать сравнение алгоритма сортировки слияния с этими числами 45 62 98 89 47 59 72 82 45 18, и я получаю 26 сравнений, так как вы можете видеть, что мои номера на всем протяжении место (по порядку), они являются случайным числом (0-100), так как я смотрю на 10 чисел, я думаю, что это худший сценарий, или нет? – miatech