



(8 votes)/* bisweepsort.c by mwberryman on metalshell.com * * Based on the sort algorithm in bubblesort.c which is * as simple as it gets in the sorting business. * * Added basic improvements to make a bi-directional sweep * sort. Added check to short-circuit sort operation as soon * as the program detects that the array is sorted. Limit * sweeping of values to the unsorted middle of the array. * * Also added some debugging messages so one can follow the * progress of a sort. * * http://www.metalshell.com/ * */ #include <stdlib.h> #include <stdio.h> #define ARRAY_SIZE 20 void print_array(int *array) { int x; for(x = 0; x < ARRAY_SIZE; x++) { if(x != ARRAY_SIZE-1) fprintf(stdout, "%d, ", array[x]); else fprintf(stdout, "%d\n", array[x]); } } int main() { int iarray[ARRAY_SIZE]; int x, y, holder; // Seed rand() srand((unsigned int)time(NULL)); for(x = 0; x < ARRAY_SIZE; x++) iarray[x] = (int)(rand() % 100); fprintf(stdout, "Before Sort\n---------------\n"); print_array(iarray); printf("\n"); // Bubble sort method with bi-directional sweeping. // // Check after each sweep if any more sweeps need // to be done. If any sweep results in no movement // of values then the array is sorted so short_circuit // the sort operation. // // After each sweep reduce the upper or lower limit // of array which must be swept. int ul=ARRAY_SIZE; int ll=0; int sorted=1; for(x = ll; x < ARRAY_SIZE; x++) { /* Sweep largest value to end */ printf("x=%d\n",x); sorted=1; for(y = ll; y < ul-1; y++) { printf("y=%d ",y); if(iarray[y] > iarray[y+1]) { holder = iarray[y+1]; iarray[y+1] = iarray[y]; iarray[y] = holder; sorted=0; } } printf("\n"); print_array(iarray); /* short circuit the process if array is now sorted */ if (sorted) { printf("Found sorted A\n"); break; } /* Reduce upper limit on array since the larger values have been swept to the end. */ ul--; /* Bubble smallest value to beginning */ sorted=1; for(y = ul-1; y > ll; y--) { printf("y=%d ",y); if(iarray[y] < iarray[y-1]) { holder = iarray[y-1]; iarray[y-1] = iarray[y]; iarray[y] = holder; sorted=0; } } printf("\n"); print_array(iarray); /* short circuit the process if array is now sorted */ if (sorted) { printf("Found sorted B\n"); break; } /* Increase lower limit on array since the smaller values have been swept to the beginning. */ ll++; } fprintf(stdout, "\nAfter Sort\n---------------\n"); print_array(iarray); }