|
|
1.1 ! root 1: ! 2: /* An intuitive sort, if not a fast one. It incrementally builds a sorted ! 3: * list by considering each element in turn and inserting it in its proper ! 4: * place among those already sorted. In the beginning, the first element ! 5: * constitutes the sorted list. Then, inserting second element before or ! 6: * after the first element creates a sorted list length two. Subsequent ! 7: * elements are inserted into the growing list. Each insertion becomes more ! 8: * costly as the sorted list gets longer since it takes longer to find the ! 9: * proper place--notice how insertion sort slows down as it gets to the final ! 10: * elements. It is an O(n^2) sort, but works well on small data sets and takes ! 11: * advantage of partially sorted data. ! 12: * ! 13: * Author: Julie Zelenski, NeXT Developer Support ! 14: * You may freely copy, distribute and reuse the code in this example. ! 15: * NeXT disclaims any warranty of any kind, expressed or implied, as to ! 16: * its fitness for any particular use. ! 17: */ ! 18: ! 19: ! 20: #import "InsertionSort.h" ! 21: ! 22: ! 23: @implementation InsertionSort:GenericSort ! 24: ! 25: ! 26: - init; ! 27: { ! 28: [super init]; ! 29: sortName = "Insertion Sort"; ! 30: sortNum = INSERTION_SORT; ! 31: return self; ! 32: } ! 33: ! 34: ! 35: - sort; ! 36: /* There is slight inconsistency in my Insertion Sort algorithm which I should ! 37: * explain. Typically when you are trying to insert a value into place, you ! 38: * save the value and keep moving its neighbors up one it until you find where ! 39: * the value belongs. You would use a move instruction to put the saved value ! 40: * in its final place rather than swap it all the way there. For the purposes ! 41: * of animation, the swapping looked better, so I do the swaps, but I subtract ! 42: * a move from Insertion Sort's counter each time, because it is not fair to ! 43: * charge Insertion Sort for two moves, when the algorithm really only calls ! 44: * for one. ! 45: * I know this is sort of cheesy, but Sorting In Action is a teaching tool, ! 46: * and it is very helpful to see this visual animation of what Insertion Sort ! 47: * is doing. If you are purist, you could replace this algorithm with one ! 48: * that performs more like a pure Insertion Sort. ! 49: */ ! 50: { ! 51: int c,d; ! 52: BOOL found; ! 53: ! 54: [super sort]; ! 55: fcalls ++; ! 56: for (c = 1; c < numElements; c++){ ! 57: found = NO; ! 58: d = c-1; ! 59: while ((d >= 0) && !found) { // move to left until find right place ! 60: if ([self lessThan:d+1 :d]) { ! 61: [self swap:d+1 with:d]; // swap each time (for visual effect) ! 62: moves--; // but subtract move to make fair ! 63: d--; ! 64: } else ! 65: found = YES; ! 66: } ! 67: } ! 68: [self sortDone]; ! 69: return self; ! 70: } ! 71: ! 72: @end
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.