/*
* @(#)SwapSortAlgorithm.java 1.0 95/06/26 Jason Harrison
*
* Copyright (c) 1995 University of British Columbia
*
* Permission to use, copy, modify, and distribute this software
* and its documentation for NON-COMMERCIAL purposes and without
* fee is hereby granted provided that this copyright notice
* appears in all copies. Please refer to the file "copyright.html"
* for further important copyright and licensing information.
*
* UBC MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
* THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
* TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
* PARTICULAR PURPOSE, OR NON-INFRINGEMENT. UBC SHALL NOT BE LIABLE FOR
* ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
* DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
*/
/**
* A swap sort demonstration algorithm
*
* We know how the data was constructed and can use this to our advantage.
* THIS IS NOT A SORT! DO NOT USE THIS ROUTINE FOR REAL APPLICATIONS.
* IT IS ONLY A DEMONSTRATION OF HOW LONG IT TAKES JAVA TO SWAP N ELEMENTS.
*
* EQUIVALENT CODE:
* for (int i = 0; i < a.length; i++ ) {
* a[i] = i;
* }
*
* SortAlgorithm.java, Thu Oct 27 10:32:35 1994
*
* @author Jason Harrison@cs.ubc.ca
* @version 1.0, 26 Jun 1995
*
*/
class SwapSortAlgorithm extends SortAlgorithm {
void sort(int a[]) throws Exception {
int max = a[0];
/*
* Originally the SortItem class created arrays without duplicates
* and thus every item had a single correct location in the final
* sorted array. With duplicates there are many correct final
* locations and we cannot just swap an item into the final spot.
*
* So fill the array the old way, shuffle it and then continue with
* the old algorithm. (This the old is SortItem::scramble())
* Even then this doesn't always work due to floating point
* limitations.
*/
/*
* The array a holds values from 0 to max where a.length = max / f.
* Here we find max.
*/
for (int i = 1; i < a.length; i++) {
if (max < a[i]) {
max = a[i];
}
}
/*
* Now find f, the scaling factor for drawing the contents of
* the array a. The correct value for a[j] is j / f.
*/
double f = ((double) a.length - 1.0) / (double) max;
/*
* Fill the array with random numbers from 0..a.length-1
*/
for (int i = a.length; --i >= 0;) {
a[i] = (int)(i / f);
}
/*
* Shuffle the array
*/
for (int i = a.length; --i >= 0;) {
int j = (int)(i * Math.random());
int t = a[i];
a[i] = a[j];
a[j] = t;
}
pause();
/*
* Now sort the array.
* Each time through the loop we remove a value, find it's correct
* position in the array, and place it there. The displaced
* value becomes the next value to place.
*/
int T = a[0];
int S = a[1];
for (int i = 0; i < a.length; i++) {
if (stopRequested) {
return;
}
S = a[(int) (T * f)];
/*
* If the item we're trying to move is supposed to where the
* next item goes we'll get stuck in a fixed point.
* Pick a new starting point.
*/
if( T == S) {
T = a[(int) (Math.random() * a.length)];
S = a[(int) (T * f)];
}
a[(int) (T * f)] = T;
T = S;
pause((int) (S * f), (int) (T * f));
}
}
}