|
|
1.1 ! root 1: ! 2: /* A fairly fast and extremely stable recursive algorithm. It divides the ! 3: * data set into two equal halves, recursively sorts those two halves, and ! 4: * then merges the results together. It is very consistent - if makes no ! 5: * difference if the data is sorted or not. Merge Sort is always O(nlogn). ! 6: * As a side note, this sort uses more memory than my other sorts because I ! 7: * create a new array to hold the sorted and merged array. I once heard there ! 8: * was an algorithm to merge the two within the same array, but I couldn't ! 9: * figure that one out. ! 10: * ! 11: * Author: Julie Zelenski, NeXT Developer Support ! 12: * You may freely copy, distribute and reuse the code in this example. ! 13: * NeXT disclaims any warranty of any kind, expressed or implied, as to ! 14: * its fitness for any particular use. ! 15: */ ! 16: ! 17: ! 18: #import "MergeSort.h" ! 19: ! 20: ! 21: @implementation MergeSort:GenericSort ! 22: ! 23: - init ! 24: { ! 25: [super init]; ! 26: sortName = "Merge Sort"; ! 27: sortNum = MERGE_SORT; ! 28: return self; ! 29: } ! 30: ! 31: ! 32: - merge:(int)begin to:(int)end middle:(int)middle ! 33: { ! 34: int firstHalf, secondHalf, count; ! 35: ! 36: fcalls++; ! 37: firstHalf = count = begin; ! 38: secondHalf = middle + 1; ! 39: while ((firstHalf <= middle) && (secondHalf <= end)) ! 40: tempData[count++] = (![self lessThan:secondHalf :firstHalf]) ! 41: ? data[firstHalf++] : data[secondHalf++]; // merge into temp array ! 42: if (firstHalf <= middle) ! 43: while (firstHalf <= middle) ! 44: tempData[count++] = data[firstHalf++]; // empty out first half ! 45: else ! 46: while (secondHalf <= end) ! 47: tempData[count++] = data[secondHalf++]; // or empty out second half ! 48: for (count = begin; count <= end; count++) ! 49: [self moveValue:tempData[count] to:count]; // move out of temp array ! 50: return self; ! 51: } ! 52: ! 53: ! 54: - mergesort:(int)begin to:(int)end ! 55: { ! 56: int middle; ! 57: ! 58: fcalls++; ! 59: if (begin != end) { ! 60: middle = (begin + end) / 2; ! 61: [self mergesort:begin to:middle]; // sort first half ! 62: [self mergesort:(middle+1) to:end]; // sort second half ! 63: [self merge:begin to:end middle:middle]; // merge the two halves ! 64: } ! 65: return self; ! 66: } ! 67: ! 68: ! 69: - sort ! 70: { ! 71: [super sort]; ! 72: tempData = (int *)calloc(numElements,sizeof(int)); // allocate temp array ! 73: [self mergesort:0 to:(numElements-1)]; ! 74: cfree(tempData); // cfree temporary array ! 75: [self sortDone]; ! 76: return self; ! 77: } ! 78: @end
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.