2017-02-12 5 views
1

Я пытаюсь подсчитать свопы в сортировке слияния. Это казалось очень простым предложением, но, похоже, проблема с моей логикой.Swift: подсчет свопов в сортировке слияния

Вот соответствующая часть моего кода, где я пытаюсь, чтобы увеличить свой счет:

while leftIndex < leftPile.count && rightIndex < rightPile.count { 
     if leftPile[leftIndex] < rightPile[rightIndex] { 
      // nothing swapped here 
      orderedPile.append(leftPile[leftIndex]) 
      leftIndex += 1 
     } else if leftPile[leftIndex] > rightPile[rightIndex] { 
      orderedPile.append(rightPile[rightIndex]) 
      // item taken from right pile == swapped -> increment swapCount 
      swapCount += 1 
      rightIndex += 1 
     } else { 
      orderedPile.append(leftPile[leftIndex]) 
      leftIndex += 1 
      // item taken from left pile == swapped -> increment swapCount 
      swapCount += 1 
      orderedPile.append(rightPile[rightIndex]) 
      rightIndex += 1 
     } 
    } 

По какой-то причине, я счетную 5 свопов со следующим массивом:

unsortedArray = [2, 1, 3, 1, 2] 
sortedArray = [1, 1, 2, 2, 3] 
swapCount = 5 

Вот мой полный класс:

class MergeSortWithCounter { 

    var swapCount: Int64 

    init() { 
     swapCount = 0 
    } 

    func mergeSort<T: Comparable>(_ array: [T]) -> [T] { 
     guard array.count > 1 else { return array } 
     let middleIndex = array.count/2 
     let leftArray = mergeSort(Array(array[0..<middleIndex])) 
     let rightArray = mergeSort(Array(array[middleIndex..<array.count])) 
     return merge(leftPile: leftArray, rightPile: rightArray) 
    } 

    func merge<T: Comparable>(leftPile: [T], rightPile: [T]) -> [T] { 

     var leftIndex = 0 
     var rightIndex = 0 
     var orderedPile = [T]() 
     if orderedPile.capacity < leftPile.count + rightPile.count { 
      orderedPile.reserveCapacity(leftPile.count + rightPile.count) 
     } 

     while leftIndex < leftPile.count && rightIndex < rightPile.count { 
      if leftPile[leftIndex] < rightPile[rightIndex] { 
       // nothing swapped here 
       orderedPile.append(leftPile[leftIndex]) 
       leftIndex += 1 
      } else if leftPile[leftIndex] > rightPile[rightIndex] { 
       orderedPile.append(rightPile[rightIndex]) 
       // item taken from right pile == swapped -> increment swapCount 
       swapCount += 1 
       rightIndex += 1 
      } else { 
       orderedPile.append(leftPile[leftIndex]) 
       leftIndex += 1 
       // item taken from left pile == swapped -> increment swapCount 
       swapCount += 1 
       orderedPile.append(rightPile[rightIndex]) 
       rightIndex += 1 
      } 
     } 

     while leftIndex < leftPile.count { 
      orderedPile.append(leftPile[leftIndex]) 
      leftIndex += 1 
     } 

     while rightIndex < rightPile.count { 
      orderedPile.append(rightPile[rightIndex]) 
      rightIndex += 1 
     } 

     return orderedPile 
    } 
} 

Я знаю, что мне не хватает чего-то супер простого, n Я хочу признать, где моя ошибка.

Благодарим за понимание!

+1

Почему думаю, 5 не так? (Извините, если я плотный, но у меня нет ожиданий относительно того, каким будет правильный ответ. Поэтому я действительно спрашиваю, а не критикую.) – matt

+1

Также у вас замечательный отладчик, поэтому вы можете просто пройти через код и посмотреть для себя, что происходит. – matt

+0

Благодарим вас за чтение. Это массив тестов хакерских рангов. Говорят, что это 4. Я думаю, что моя проблема заключается в заявлении else. В настоящий момент я не рядом с моей машиной, но я буду возиться с ней, когда буду перед ней. – Adrian

ответ

1

Вы обменивать в равном случае, когда вы не должны:

 if leftPile[leftIndex] < rightPile[rightIndex] { 
      // nothing swapped here 

Вы имели в виду

 if leftPile[leftIndex] <= rightPile[rightIndex] { 
      // nothing swapped here 
+0

Спасибо! Вот и все. – Adrian

+0

@Pierce У меня есть проблема с большими наборами данных. Я слишком дешев, чтобы купить кучу тестовых примеров, но один из комментаторов сказал, что он использовал Long, чтобы обойти проблему емкости с ванильным 'Int'. Вот почему у меня есть «Int64» в качестве счетчика. Я буду держать вас в курсе, когда я все выясню. Я собираюсь положить это в проект Xcode, а не на детскую площадку, чтобы понять это. Многое происходит с массивами и т. Д. Для устранения неполадок без контрольных точек. – Adrian

+0

@Adrian - Я нашел одну основную причину, по которой я все время выходил из строя, и я забыл поставить инструкцию 'guard' в начале' mergeSort', поэтому он просто продолжал работать, пока не истечет время ожидания, пытаясь сортировать массивы с только один объект. Даже после того, как я установил, что у меня все еще есть проблемы с половиной тестовых случаев. Давайте посмотрим, можем ли мы это исправить. Эта конкретная проблема сводила меня с ума, пытаясь решить с Свифтом. Еще одна проблема, с которой я столкнулся с проблемой Swift, - это проблема структуры данных, связанная с Tries. – Pierce

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