决策树、记数排序、基数排序

 

 

//决策树 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);
}

 

posted on 2013-03-02 22:35  mhgu  阅读(224)  评论(0编辑  收藏  举报