现在的位置: 首页 > 综合 > 正文

hdu 1425 sort (基数排序)

2013年06月01日 ⁄ 综合 ⁄ 共 1424字 ⁄ 字号 评论关闭

hdu 1425 sort (基数排序)

题意:排序。。

解题思路:很简单的一道题,用个sort就过去了。这里我想介绍的是一种线性的排序方法(当然用在这题并非很合适)----基数排序。其实原理还是蛮简单的,就是先以最低位为关键字,排一次序,然后将排好的序列再根据第二位数字排序,以此类推到最高位(这里最高位我给他定为6,如果不到6位数的,超出的位数就当做是0)。那么,我们就把每个数,在排序的位数上的数值取出来,将其作为关键字,进行一次计数排序(o(n)的排序算法),这样一直排到最高位,结果就出来了。要注意的是,我们可能遇到负数,这里我的处理是,在排序的时候,负数取其绝对值,排好之后,按从小到大的顺序枚举,遇到负数(先遇到的是绝对值较小的,但是值却是较大的),就将其放入栈里面,处理完之后,将栈里的元素依次退栈取出放到数组里,可以发现,先取出的是较小的(因为其绝对值较大,而又是负的,所以值是较小的),然后再根据排好的顺序,将正的数依次放到数组里,ok了。

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std ;

const int maxn = 1111111 ;
int wa[maxn] , wb[maxn] , ws[maxn] ;
int *pos[2] , num[maxn] , sta[maxn] ;
int b[maxn] , f[15] , ans[maxn] ;

int get ( int n , int k ) {
    return ( n % f[k] / f[k-1] ) ;
}

void solve ( int t , int n ) {
    int k = t ^ 1 , i ;
    for ( i = 0 ; i < 10 ; i ++ ) ws[i] = 0 ;
    for ( i = 1 ; i <= n ; i ++ ) ws[b[i]] ++ ;
    for ( i = 1 ; i < 10 ; i ++ ) ws[i] += ws[i-1] ;
    for ( i = n ; i >= 1 ; i -- ) {
        int p = pos[t][i] ;
        pos[k][ws[b[p]]--] = p ;
    }
}

int Abs ( int a ) {
    return a >= 0 ? a : -a ;
}

int main () {
//	freopen ( "a.txt" , "r" , stdin ) ;
//	freopen ( "b.txt" , "w" , stdout ) ;
    pos[0] = wa , pos[1] = wb ;
    int n , i , j , m ;
    f[0] = 1 ;
    for ( i = 1 ; i < 15 ; i ++ ) f[i] = f[i-1] * 10 ;
    while ( scanf ( "%d%d" , &n , &m ) != EOF ) {
        for ( i = 1 ; i <= n ; i ++ )
            scanf ( "%d" , &num[i] ) ;
        for ( i = 1 ; i <= n ; i ++ )
            pos[0][i] = i ;
        int t = 0 ;
        for ( i = 1 ; i <= 7 ; i ++ ) {
            for ( j = 1 ; j <= n ; j ++ )
                b[j] = get ( Abs ( num[j] ) , i ) ;
            solve ( t , n ) ;
            t ^= 1 ;
        }
        int top = 0 ;
        int k = 0 ;
        for ( i = 1 ; i <= n ; i ++ ) {
            int p = pos[t][i] ;
            if ( num[p] < 0 ) sta[++top] = num[p] ;
        }
        while ( top ) ans[++k] = sta[top--] ;
        for ( i = 1 ; i <= n ; i ++ ) {
            int p = pos[t][i] ;
            if ( num[p] >= 0 ) ans[++k] = num[p] ;
        }
        for ( i = 1 ; i <= m ; i ++ ) {
            if ( i != 1 ) printf ( " " ) ;
            printf ( "%d" , ans[n-i+1] ) ;
        }
        puts ( "" ) ;
    }
    return 0 ;
}

抱歉!评论已关闭.