template<typename E>
inline void swap(E A[], int i, int j) {
E temp = A[i];
A[i] = A[j];
A[j] = temp;
}
template <typename E>
void insertsort(E A[], int n) {
for (int i = 1; i < n; i++)
for (int j = i; (j > 0)&&(A[j]<A[j-1]); j--)
swap(A, j, j - 1);
}
template <typename E>
void bubblesort(E A[], int n) {
for (int i = 0; i < n - 1; i++)
for (int j = n - 1; j > i; j--)
if (A[j] < A[j - 1])
swap(A, j, j - 1);
}
template <typename E>
void selectsort(E A[], int n) {
for (int i = 0; i < n - 1; i++) {
int lowindex = i;
for (int j = n - 1; j > i; j--)
if (A[j]< A[lowindex])
lowindex = j;
swap(A, i, lowindex);
}
}
template <typename E>
void inssort2(E A[], int n, int incr) {
for (int i = incr; i < n; i += incr)
for (int j = i; (j >= incr) &&
(A[j]<A[j - incr]); j -= incr)
swap(A, j, j - incr);
}
template <typename E>
void shellsort(E A[], int n) {
for (int i = n / 2; i > 2; i /= 2)
for (int j = 0; j < i; j++)
inssort2<E>(&A[j], n - j, i);
inssort2<E>(A, n, 1);
}
template <typename E>
void mergesort(E A[], E temp[], int left, int right) {
if (left == right) return;
int mid = (left + right) / 2;
mergesort<E>(A, temp, left, mid);
mergesort<E>(A, temp, mid + 1, right);
for (int i = left; i <= right; i++)
temp[i] = A[i];
int i1 = left; int i2 = mid + 1;
for (int curr = left; curr <= right; curr++) {
if (i1 == mid + 1)
A[curr] = temp[i2++];
else if (i2 > right)
A[curr] = temp[i1++];
else if (temp[i1]< temp[i2])
A[curr] = temp[i1++];
else A[curr] = temp[i2++];
}
}
template <typename E, typename Comp>
inline int partition(E A[], int l, int r, E& pivot) {
do {
while (A[++l] < pivot);
while ((l < r) && (pivot < A[--r]));
swap(A, l, r);
} while (l < r);
return l;
}
template <typename E>
void qsort(E A[], int i, int j) {
if (j <= i) return;
int pivotindex = findpivot(A, i, j);
swap(A, pivotindex, j);
int k = partition<E>(A, i - 1, j, A[j]);
swap(A, k, j);
qsort<E>(A, i, k - 1);
qsort<E>(A, k + 1, j);
}
template <typename E>
class HeapSort {
public:
void AdjustDown(int* A, int root, int n) {
int parent = root;
int child = parent * 2 + 1;
while (child < n) {
if ((child + 1) < n && A[child + 1] > A[child]) {
++child;
}
if (A[child] > A[parent]) {
swap(A[child], A[parent]);
parent = child;
child = parent * 2 + 1;
}
else
break;
}
}
int* heapSort(int* A, int n) {
assert(A);
for (int i = (n - 2) / 2; i >= 0; i--) {
AdjustDown(A, i, n);
}
int end = n - 1;
while (end > 0) {
swap(A[0], A[end]);
AdjustDown(A, 0, end);
end--;
}
return A;
}
};
int maxbit(int data[], int n)
{
int d = 1;
int p = 10;
for (int i = 0; i < n; ++i)
{
while (data[i] >= p)
{
p *= 10;
++d;
}
}
return d;
}
void radixsort(int data[], int n)
{
int d = maxbit(data, n);
int tmp[100];
int count[10];
int i, j, k;
int radix = 1;
for (i = 1; i <= d; i++)
{
for (j = 0; j < 10; j++)
count[j] = 0;
for (j = 0; j < n; j++)
{
k = (data[j] / radix) % 10;
count[k]++;
}
for (j = 1; j < 10; j++)
count[j] = count[j - 1] + count[j];
for (j = n - 1; j >= 0; j--)
{
k = (data[j] / radix) % 10;
tmp[count[k] - 1] = data[j];
count[k]--;
}
for (j = 0; j < n; j++)
data[j] = tmp[j];
radix = radix * 10;
}
}
int