#include <iostream>
using namespace std;
//选择排序,计算出每个元素的名次
template<class T>
void rank1(T a[], int n, int r[])
{
for(int i = 0; i < n; i++)
r[i] = 0;//初始化
for(int i = 1;i < n;i++)
for(int j = 0; j < i; j++)
{
if(a[j] <= a[i])
r[i]++;
else
r[j]++;
}
}
//原地重排
template <class T>
void rearrange(T a[], int n, int r[])
{
for(int i = 0; i < n; i++)
{
if(i == r[i])
i++;
else
swap(a[r[i]], a[i]);
}
}
//前n个元素中最大值的索引值
template<class T>
int indexOfMax(T a[],int n)
{
int maxIndx = 0;
for(int i = 1; i < n; i++)
{
if(a[maxIndx] < a[i])
maxIndx = i;
}
return maxIndx;
}
//选择排序
template<class T>
void selectionRank(T a[], int n)
{
for(int size = n; size > 1; size--)
{
int j = indexOfMax(a, size);
swap(a[j],a[size - 1]);
}
}
//selectionsort:及时终止的选择排序
template<class T>
void selectionSort(T a[],int n)
{
bool sorted = false;
for(int size = n;!sorted && (size > 1); size--)//如果有序则及时终止
{
int indxOfMax = 0;
for(int i = 1;i < size; i++)
if(a[indxOfMax] <= a[i])
indxOfMax = i;
else sorted = false;//无序
swap(a[indxOfMax], a[size - 1]);
}
}
//一次冒泡排序,如果一次冒泡排序中,没有发生交换,则序列本身就是有序的,可终止排序
template<class T>
bool bubble(T a[], int n)
{
bool swapped = false;
for(int i = 0; i < n - 1; i++)
if (a[i] > a[i+1])
{
swap(a[i], a[i+1]);
swapped = true;
}
return swapped;
}
//冒泡排序
template<class T>
void bubbleSort(T a[], int n)
{
for(int i = n; bubble(a,i) && (i > 1); i--);
}
/*
//一次冒泡排序,没有及时终止排序
template<class T>
void bubble(T a[], int n)
{
for(int i = 0; i < n - 1; i++)
if (a[i] > a[i+1])
swap(a[i], a[i+1]);
}
//冒泡排序
template<class T>
void bubbleSort(T a[], int n)
{
for(int i = n; i > 1; i--)
bubble(a,i);
}
*/
//往有序数列a中插入数x,数组大小为n
template<class T>
void insert1(T a[], int n, const T& x)
{
int i;
for (i = n - 1; i >= 0 && x < a[i]; i--)
a[i+1] = a[i];
a[i+1] = x;
}
//插入排序,数组大小依次从1增到n
template<class T>
void insertionSort(T a[], int n)
{
for (int i = 1; i < n; i++)
{
T t = a[i];
insert1(a, i, t);
}
}
int main()
{
int a[] = {8,4,2,9,6,3,5,7,1};
insertionSort(a,9);
for(int i = 0; i < 9; i++)
{
cout << a[i];
}
return 0;
}
using namespace std;
//选择排序,计算出每个元素的名次
template<class T>
void rank1(T a[], int n, int r[])
{
for(int i = 0; i < n; i++)
r[i] = 0;//初始化
for(int i = 1;i < n;i++)
for(int j = 0; j < i; j++)
{
if(a[j] <= a[i])
r[i]++;
else
r[j]++;
}
}
//原地重排
template <class T>
void rearrange(T a[], int n, int r[])
{
for(int i = 0; i < n; i++)
{
if(i == r[i])
i++;
else
swap(a[r[i]], a[i]);
}
}
//前n个元素中最大值的索引值
template<class T>
int indexOfMax(T a[],int n)
{
int maxIndx = 0;
for(int i = 1; i < n; i++)
{
if(a[maxIndx] < a[i])
maxIndx = i;
}
return maxIndx;
}
//选择排序
template<class T>
void selectionRank(T a[], int n)
{
for(int size = n; size > 1; size--)
{
int j = indexOfMax(a, size);
swap(a[j],a[size - 1]);
}
}
//selectionsort:及时终止的选择排序
template<class T>
void selectionSort(T a[],int n)
{
bool sorted = false;
for(int size = n;!sorted && (size > 1); size--)//如果有序则及时终止
{
int indxOfMax = 0;
for(int i = 1;i < size; i++)
if(a[indxOfMax] <= a[i])
indxOfMax = i;
else sorted = false;//无序
swap(a[indxOfMax], a[size - 1]);
}
}
//一次冒泡排序,如果一次冒泡排序中,没有发生交换,则序列本身就是有序的,可终止排序
template<class T>
bool bubble(T a[], int n)
{
bool swapped = false;
for(int i = 0; i < n - 1; i++)
if (a[i] > a[i+1])
{
swap(a[i], a[i+1]);
swapped = true;
}
return swapped;
}
//冒泡排序
template<class T>
void bubbleSort(T a[], int n)
{
for(int i = n; bubble(a,i) && (i > 1); i--);
}
/*
//一次冒泡排序,没有及时终止排序
template<class T>
void bubble(T a[], int n)
{
for(int i = 0; i < n - 1; i++)
if (a[i] > a[i+1])
swap(a[i], a[i+1]);
}
//冒泡排序
template<class T>
void bubbleSort(T a[], int n)
{
for(int i = n; i > 1; i--)
bubble(a,i);
}
*/
//往有序数列a中插入数x,数组大小为n
template<class T>
void insert1(T a[], int n, const T& x)
{
int i;
for (i = n - 1; i >= 0 && x < a[i]; i--)
a[i+1] = a[i];
a[i+1] = x;
}
//插入排序,数组大小依次从1增到n
template<class T>
void insertionSort(T a[], int n)
{
for (int i = 1; i < n; i++)
{
T t = a[i];
insert1(a, i, t);
}
}
int main()
{
int a[] = {8,4,2,9,6,3,5,7,1};
insertionSort(a,9);
for(int i = 0; i < 9; i++)
{
cout << a[i];
}
return 0;
}