//决策树 O(nlgn)
const order[][3] = {
{0,1,2},{0,2,1},{1,0,2},{1,2,0},{2,0,1},{2,1,0},
};
int descide_tree_sort(int a1, int a2, int a3;)
{
if (a1<a2) {
if (a2<a3) return 0; //out( a1<a2<a3 );
else {
if (a1<a3) return 1; //out( a1<a3<=a2 );
else return 4; //out( a3<=a1<a2 );
}
}
else {
if (a1<a3) return 2; //out( a2<=a1<a3 );
else {
if (a2<a3) return 3; //out( a2<a3<=a1 );
else return 5; //out( a3<=a2<=a1 );
}
}
return -1;
}
//记数排序
/*
* 数组A[0...N-1]中的元素都小于K,
* 数组C[0...K-1]中用于记数,C[i]表示数组A[]中小于i的元素个数。
* 数组O[0...N-1]用于输出。
* */
void counting_sort(int A[], int n, int C[], int k, int O[])
{
for (int i=0; i<k; i++)
C[i] = 0;
for (int i=0; i<n; i++)
C[A[i]]++; // C[i] 表示等于i的元素个数。
for (int i=1; i<k; i++)
C[i] += C[i-1]; // C[i] 表示小于等于i的元素个数。
for (int i=n-1; i>=0; i--) {
O[ C[A[i]] ] = A[i];
C[A[i]]--; // 下一个等于A[i]的元素直接放入在C[]中的A[i]的前一个位置。
}
}
//基数排序
//根据数值的位进行排序。比如四位数,依次根据数值的个位,
//十位,百位,千位数字使用稳定排序。
// 如:
/*
320 702 720 329
457 355 329 355
657 436 436 436
839 => 457 => 839 => 457
436 657 355 657
720 329 457 720
355 839 657 839
^ ^ ^
*/
/* R 表示基数
* d = lg( max(A[]) )。
* */
#define R 16
void radix_sort(int A[], int n, int d)
{
for (int i=0; i<d; i++)
stable_sort(A, n, i);
}