2012-05-21 4 views
-1
using System; 

namespace MergeSort 
{ 
    class Program 
    { 
     static int[] vektor = { 5, 7, 8, 9, 1, 2, 23, 4 }; 
     static int[] delVektor; 
     static int counter = 0; 

     static void Main(string[] args) 
     { 
      PrintVektor(vektor); 
      Merge(0, vektor.Length - 1); 
      Console.WriteLine("--------"); 
      PrintVektor(vektor); 
      Console.ReadKey(); 
     } 

     static void PrintVektor(int[] vektor) 
     { 
      foreach (var item in vektor) 
      { 
       Console.WriteLine(item.ToString() + " "); 
      } 
     } 

     static void Merge(int start, int stop) 
     { 
      if (start >= stop) 
       return; 

      int middle = (start + stop)/2; 

      Merge(start, middle); 
      Merge(middle + 1, stop); 

      delVektor = new int[stop - start + 1]; 

      int indexStart = start; 
      int indexStop = middle + 1; 

      while (indexStart <= middle && indexStop <= stop) 
      { 
       if (vektor[indexStart] < vektor[indexStop]) 
       { 
        delVektor[counter] = vektor[indexStart]; 
        indexStart++; 
        counter++; 
       } 

       else 
       { 
        delVektor[counter] = vektor[indexStop]; 
        indexStop++; 
        counter++; 
       } 
      } 

      while (indexStart <= middle) 
      { 
       delVektor[counter] = vektor[indexStart]; 
       indexStart++; 
       counter++; 
      } 

      while (middle <= stop) 
      { 
       delVektor[counter] = vektor[indexStop]; // <---- here i get index out of range 
       indexStop++; 
       counter++; 
      } 

      for (int i = 0; i <= delVektor.Length - 1; i++) 
      { 
       vektor[start + i] = delVektor[i]; 
      } 
     } 
    } 
} 

Вещь я получаю индекс из исключения диапазона (я прокомментировал в коде),Проблемы с моим слиянием Алгоритм C#

while (middle <= stop) { 
    delVektor[counter] = vektor[indexStop]; // <---- here i get index out of range 
    indexStop++; counter++; 
} 

Я не могу понять это

я не знаю, что я делаю неправильно. Я так долго смотрел на этот код, что просто хочу выкинуть компьютер из окна, как только попытаюсь его исправить.

+3

MergeSort обычно разбит на два метода: 'mergesort' и' merge'. Кажется, вы объединили их в один метод, который выглядит запутанным. Взгляните на страницу википедии: http://en.wikipedia.org/wiki/Merge_sort, у нее есть хорошая информация. Также я предполагаю, что вы бесконечно рекурсивно. –

+2

Если этот вопрос задается домашним заданием, отметьте его как таковой. –

+0

что не работает? то, что было результатом и чего вы ожидали –

ответ

0

Когда вы используете индекс в массиве и увеличиваете этот индекс, вам нужно проверить, действительно ли этот индекс находится в границах массива (индексы на основе 0 для вашего кода).

Вы испытываете свой индекс, гарантируя, что он не может выйти из-под контроля?

+0

да это я домашнее задание, но я не могу отредактировать его с тегом .. нет, я должен попробовать некоторые if-утверждения? – moofoo

+0

Не является ли это хорошим программистом возможность найти ответ в Интернете в любом случае? :) – Allensb

+0

@moofoo no вы не должны пытаться исправить симптом, добавив некоторые (произвольные), если вы должны взглянуть на логику и посмотреть, правильно ли это. Заканчивают ли ваши циклы, когда вы ожидаете их? –

0

Посмотрите на условие, которое вы используете в цикле, где вы получаете исключение. Обратите внимание, что если условие истинно при первом входе, оно будет истинным навсегда. Исправление должно быть очевидно. (Подсказка:. Ничего в теле цикла не должно быть изменено)

1

Это ваша проблема:

if (start >= stop) 
      return; 

     int middle = (start + stop)/2; 

     Merge(start, middle); 
     Merge(middle + 1, stop); 

Вы не должны return если start>=stop вы просто должны пропускать сегменты слияния. Вот исправление:

int middle = (start + stop)/2; 
if (start < stop){ 

     Merge(start, middle); 
     Merge(middle + 1, stop); 
} 
//...put the rest of the code which you already have here 
+0

Если у вас все еще есть проблемы, вы должны проверить mergesort на Geekviewpoint: http://geekviewpoint.com/Sort_Algorithms_in_java/ – kasavbere

+0

Я пробовал это исправление, и я все еще получаю indexOutOfRange, когда мой массив темпа - это 1 большой ... счетчик 1 - это то, что проблема? У вас есть это, чтобы работать? – moofoo

+0

Вы должны перейти по ссылке к geekviewpoint. Существует простая в использовании реализация: geekviewpoint.com/Sort_Algorithms_in_java. Либо прокрутите вниз, либо выполните поиск слияния. – kasavbere

1

исправлен код. (возможно)

using System; 

namespace MergeSort{ 
    class Program{ 
     static int[] vektor = { 5, 7, 8, 9, 1, 2, 23, 4 }; 
     static int[] delVektor; 
     static int counter = 0; 

     static void Main(string[] args){ 
      PrintVektor(vektor); 
      Merge(0, vektor.Length - 1); 
      Console.WriteLine("--------"); 
      PrintVektor(vektor); 
      Console.ReadKey(); 
     } 

     static void PrintVektor(int[] vektor){ 
      foreach (var item in vektor) 
       Console.Write(item.ToString() + " "); 
      Console.WriteLine(""); 
     } 

     static void Merge(int start, int stop){ 
      if (start >= stop) 
       return; 

      int middle = (start + stop)/2; 

      Merge(start, middle); 
      Merge(middle + 1, stop); 

      delVektor = new int[stop - start + 1]; 
      counter = 0;//add 

      int indexStart = start; 
      int indexStop = middle + 1; 

      while (indexStart <= middle && indexStop <= stop){ 
       if (vektor[indexStart] < vektor[indexStop]){ 
        delVektor[counter] = vektor[indexStart]; 
        indexStart++; 
        counter++; 
       } else { 
        delVektor[counter] = vektor[indexStop]; 
        indexStop++; 
        counter++; 
       } 
      } 

      while (indexStart <= middle){ 
       delVektor[counter] = vektor[indexStart]; 
       indexStart++; 
       counter++; 
      } 

      while (indexStop <= stop){//edit 
       delVektor[counter] = vektor[indexStop]; 
       indexStop++; 
       counter++; 
      } 

      for (int i = 0; i <= delVektor.Length - 1; i++){ 
       vektor[start + i] = delVektor[i]; 
      } 
     } 
    } 
} 
+0

Хорошие уловы!Счетчик никогда не был сброшен на 0, и в то время как цикл проверял условие, которое никогда не изменилось бы в теле цикла! – dplante

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