www.pudn.com > ArraySort.zip > sort.h


/* 
	Author:	David Martinjak 
	Date:	December, 2001 
	Email:	martinfd@muohio.edu 
 
	This is a class header file that you can implement 
	in a driver program (such as the included sortmain.cpp) 
	to sort arrays of multiple types.   
 
	This software is open source code, and is provided 
	as-is with no warranties whatsoever.  Please feel 
	free to make modifications and use for your own 
	intents and purposes. 
 
  */ 
 
#include  
#include  
 
 
template  
class sort { 
public: 
	sort(int);								// constructor 
	void bubble(T array[]);					// bubble sort 
	void insertion(T array[]);				// insertion sort 
	void quick(T array[], int, int);		// quick sort 
	void selection(T array[]);				// selectioni sort 
 
private: 
	int size; 
}; 
 
 
 
template  
sort::sort(int s) { 
	if (s < 0) {			// make sure the size is valid 
		cerr << "** An invalid array size was entered." << endl; 
		exit(-1); 
		return; 
	} 
 
	size = s;				// if the size is valid, assign it  
} 
 
 
template  
void sort::bubble(T array[]) { 
	 
	T temp; 
	int last = size - 1; 
	bool sorted = true; 
 
	do { 
		sorted = true; 
		for (int i = 0; i < last; i++) { 
 
			/*  
				swap elements if the higher index element is  
				greater than the smaller index element 
			 */ 
 
			if (array[i] > array[i + 1]) {	 
				temp = array[i]; 
				array[i] = array[i + 1]; 
				array[i + 1] = temp; 
				sorted = false; 
			} 
 
		} 
 
		last--; 
	} while (!sorted); 
 
} 
 
 
template  
void sort::insertion(T array[]) { 
 
	T cVal;		// current value being examined 
	 
	for (int i = 1; i < size; i++) { 
 
		cVal = array[i]; 
		for (int n = i - 1; n >= 0 && cVal < array[n]; n--) { 
			array[n + 1] = array[n]; 
		} 
 
		array[n + 1] = cVal; 
 
	}	// end for loop 
 
} 
 
 
template  
void sort::quick(T array[], int llimit, int rlimit) { 
 
	T temp; 
	int left = llimit; 
	int right = rlimit; 
	int pivot = (left + right) / 2;	// find the median 
	T median = array[pivot]; 
 
 
	do { 
 
		while ((array[left] < median) && (left < rlimit)) { 
			left++; 
		} 
 
		while ((median < array[right]) && (right > llimit)) { 
			right--; 
		} 
 
		if (left <= right) { 
 
			// swap elements 
			temp = array[left]; 
			array[left] = array[right]; 
			array[right] = temp; 
			left++; 
			right--; 
		} 
 
	} while (left <= right); 
 
 
	if (llimit < right) { 
		sort::quick(array, llimit, right); 
	} 
 
 
	if (left < rlimit) { 
		sort::quick(array, left, rlimit); 
	} 
 
} 
 
 
template  
void sort::selection(T array[]) { 
 
	T temp; 
	int min; 
 
	for (int i = 0; i < size - 1; i++) { 
		min = i; 
 
		for (int n = i + 1; n < size; n++) { 
			if (array[n] < array[min]) { 
				min = n; 
			} 
 
			temp = array[min]; 
			array[min] = array[i]; 
			array[i] = temp; 
		} 
	} 
 
}