|
|
1.1 root 1:
2: /* A classic sort, although not a particularly efficient one. Its basic
3: * strategy is to begin at top and look at the first two elements and move
4: * the larger of the two down. Then it looks at the the second and third
5: * elements, moves the larger down. It continues like this, "bubbling" the
6: * largest element down to the very bottom. Then it returns to the top to do
7: * it all over again. It finishes when no more elements need to be exchanged.
8: * It is the poorest performer of the O(n^2) sorts, although it does improve
9: * somewhat on partially sorted data. As Don Knuth said, "In short, the
10: * bubble sort seems to have nothing to recommend it, except a catchy name
11: * and the fact that it lead to some interesting theoretical problems."
12: * If you are ever tempted to use Bubble Sort, wait for the feeling to pass,
13: * and then use Insertion Sort which is marginally faster and easier to write.
14: *
15: * Author: Julie Zelenski, NeXT Developer Support
16: * You may freely copy, distribute and reuse the code in this example.
17: * NeXT disclaims any warranty of any kind, expressed or implied, as to
18: * its fitness for any particular use.
19: */
20:
21:
22: #import "BubbleSort.h"
23:
24: @implementation BubbleSort:GenericSort
25:
26:
27: - init;
28: {
29: [super init];
30: sortName = "Bubble Sort";
31: sortNum = BUBBLE_SORT;
32: return self;
33: }
34:
35:
36: - sort;
37: {
38: int a,bound;
39: BOOL sorted = NO;
40:
41: [super sort];
42: fcalls++;
43: bound = numElements - 1;
44: while (sorted == NO) { // while exchanges are still necessary
45: sorted = YES;
46: for (a = 0;a < bound; a++) {
47: if ([self lessThan:a+1 :a]) { // if less than your left neighbor
48: sorted = NO;
49: [self swap:a+1 with:a]; // swap with neighbor
50: }
51: }
52: bound--;
53: }
54: [self sortDone];
55: return self;
56: }
57:
58: @end
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.