A very simple sorting algorithm is bubblesort:
keep making passes through the array until it is sorted
on each pass
tentatively mark the array as sorted
compare each array element with the element after it
if they are out of order then swap them
and note that the array wasn't sorted
if you get through an entire pass without swapping anything
then the array must really be sorted
While simple to implement, bubblesort is very inefficient for large arrays
if there are many small values that are far out of place (since each one only
moves one spot on each entire pass through the array - whereas large values
are likely to move many spots on each pass through the array).
Comb sort is a variation of bubblesort where, instead of comparing each element with the one next to it, we compare each element with something a further distance up the array. Thus values that are far out of place jump across this 'gap' early on, and as we make more and more passes we gradually shrink the size of the gap (on the final passes the gap is set to 1 so we compare neighbours and ensure everything winds up in the exact right spot).
Bubblesort and combsort are illustrated in the comb.C code.
void swap(long &x, long &y)
{
long t = x;
x = y;
y = t;
}
// keep making passes through the array until it is sorted
// on each pass
// tentatively mark the array as sorted
// compare each array element with the element after it
// if they are out of order then swap them
// and note that the array wasn't sorted
// if you get through an entire pass without swapping anything
// then the array must really be sorted
void bubblesort(long *arr, long size)
{
if (arr == NULL) {
printf("Cannot sort NULL array\n");
} else {
for (int p = 1; p < size; p++) {
bool sorted = true;
for (int i = 1; i < size; i++) {
if (arr[i] < arr[i-1]) {
swap(arr[i], arr[i-1]);
sorted = false;
}
}
if (sorted) break;
}
}
}
// comb sort: like bubblesort except:
// compares elements across large segments of the array (gaps)
// gradually shrinks the size of the gap down to 1
// (better than bubblesort at getting rid of small values
// near the high end of the array, which force near worst
// case behaviour for bubblesort)
void combsort(long *arr, long size)
{
long gap = size;
bool swapped = false;
// keep sorting until you've made a pass
// with a gap size of 1 where nothing
// out of order was found
while ((gap > 1) || swapped) {
// shrink the size of the gap towards 1
if (gap > 1) gap = (4*gap)/5;
// check each element pair across the gap
swapped = false;
for (int i = 0; (i+gap) < size; i++) {
if (arr[i] > arr[i+gap]) {
swap(arr[i], arr[i+gap]);
swapped = true;
}
}
}
}
|