#include < cstdlib >
#include < iostream >
#include < cassert >
using namespace std;
/**/ /* output array elements */
template < class T >
void Print( const T * in , int n)
... {
for (int i = 0; i < n; i++)
...{
cout << in[i] << " ";
}
cout << endl;
}
template < class T >
void Exch2Item(T & item1, T & item2)
... {
T temp = item1;
item1 = item2;
item2 = temp;
} ;
/**/ /* bubble sort algorithm */
template < class T >
void BubbleSort(T * input, int n)
... {
assert(input != NULL);
for (int i = 0; i < n-1; i++)
...{
for (int j = 0; j < (n - i - 1) ; j++)
...{
if (input[j] > input[j + 1])
...{
Exch2Item(input[j], input[j + 1]);
}
}
}
}
/**/ /* select sort algorithm */
template < class T >
void SelectSort(T * input, int n)
... {
assert(input != NULL);
for (int i = 0; i < n-1; i++)
...{
for (int j = i + 1; j < n; j++)
...{
if (input[i] > input[j])
...{
Exch2Item(input[j], input[i]);
}
}
}
}
/**/ /* common insert sort algorithm */
template < class T >
void InsertSort(T * input, int n)
... {
T temp;
for (int i = 1; i < n; i++)
...{
temp = input[i];
for (int j = 0; j < i; j++)
...{
if (input[j] > temp)
...{
break;
}
}
for (int k = i; k >= j+1; k--)
...{
input[k] = input[k - 1];
}
input[j] = temp;
}
}
/**/ /* binary insert sort algorithm */
template < class T >
void BInsertSort(T * input, int n)
... {
T temp;
int l, r, mid, k;
for (int i = 1; i < n; i++)
...{
temp = input[i];
l = 0;
r = i - 1;
while (l <= r)
...{
mid = (l + r) / 2;
if (input[mid] < temp)
...{
l = mid +1;
}
else if (input[mid] > temp)
...{
r = mid -1;
}
else
...{
k = mid;
break;
}
}
/**//* now l is the place to insert, move forward the elements between l and i*/
for (int j = i; j >= l+1; j--)
...{
input[j] = input[j - 1];
}
input[l] = temp;
}
}
int main( int argc, char * argv[])
... {
int a[] = ...{12, 43, 1, 3, 5, 2, 7, 8, 0, 4, 89};
printf("%d ", sizeof(a));
BubbleSort(a, sizeof(a)/sizeof(int));
SelectSort(a, sizeof(a)/sizeof(int));
BInsertSort(a, sizeof(a)/sizeof(int));
Print(a, sizeof(a)/sizeof(int));
return 0;
}