Я пытаюсь реализовать сортировку слияния в объективе -C.Сортировка слияния в Objective C
Это аналогичный вопрос, заданный по следующей ссылке, не нашел ответа, так что создавал новый вопрос.
Это то, что я пытался,
-(NSArray *)mergeSort:(NSArray *)unsortedArray {
if ([unsortedArray count] < 2)
return unsortedArray;
long mid = [unsortedArray count]/2;
NSRange left = NSMakeRange(0, mid);
NSRange right = NSMakeRange(mid, [unsortedArray count] - mid);
NSArray *rightArray = [unsortedArray subarrayWithRange:right];
NSArray *leftArray = [unsortedArray subarrayWithRange:left];
NSArray *resultArray = [self merge:leftArray andRight:rightArray];
return resultArray;
}
-(NSArray *)merge:(NSArray *)leftArray andRight:(NSArray *)rightArray {
NSMutableArray *result = [NSMutableArray array];
int right = 0;
int left = 0;
while (left < [leftArray count] && right < [rightArray count]) {
NSComparisonResult comparisonResult = [leftArray[left] compare:rightArray[right]];
if (comparisonResult != NSOrderedDescending) {
[result addObject:[leftArray objectAtIndex:left++]];
} else {
[result addObject:[rightArray objectAtIndex:right++]];
}
/*if ([[leftArray objectAtIndex:left] intValue] < [[rightArray objectAtIndex:right] intValue]) {
[result addObject:[leftArray objectAtIndex:left++]];
//left++;
} else {
[result addObject:[rightArray objectAtIndex:right++]];
//right++;
}*/
}
NSRange leftRange = NSMakeRange(left, [leftArray count] - left);
NSRange rightRange = NSMakeRange(right, [rightArray count] - right);
NSArray * newRight = [rightArray subarrayWithRange:rightRange];
NSArray * newLeft = [leftArray subarrayWithRange:leftRange];
newLeft = [result arrayByAddingObjectsFromArray:newLeft];
return [newLeft arrayByAddingObjectsFromArray:newRight];
}
Пожалуйста, дайте мне знать, если у кого есть какие-либо другие подходы для сортировки слиянием.
На ваш вопрос? У вас есть проблема с кодом, опубликованным в вашем вопросе? Если да, то что именно? Быть конкретной. – rmaddy
@rmaddy: Извините за то, что не ясность, когда я ввожу приведенный выше код со следующим массивом, я не получаю вывод в отсортированном формате, Ввод: 101,201,301,121,11,123,21,14,32,76,89,987,65 Выход, который я получаю: слияние Сортированный массив: (21,14,32,76,89,101,201,301,121,11,123,987,65) –
Могу ли я спросить, какого слияния вы хотите? merge line нет одинаковых значений/элементов в массиве? – 0yeoj