hdu 1425 sort (基数排序)
2013-10-11 18:49
239 查看
hdu 1425 sort (基数排序)
题意:排序。。
解题思路:很简单的一道题,用个sort就过去了。这里我想介绍的是一种线性的排序方法(当然用在这题并非很合适)----基数排序。其实原理还是蛮简单的,就是先以最低位为关键字,排一次序,然后将排好的序列再根据第二位数字排序,以此类推到最高位(这里最高位我给他定为6,如果不到6位数的,超出的位数就当做是0)。那么,我们就把每个数,在排序的位数上的数值取出来,将其作为关键字,进行一次计数排序(o(n)的排序算法),这样一直排到最高位,结果就出来了。要注意的是,我们可能遇到负数,这里我的处理是,在排序的时候,负数取其绝对值,排好之后,按从小到大的顺序枚举,遇到负数(先遇到的是绝对值较小的,但是值却是较大的),就将其放入栈里面,处理完之后,将栈里的元素依次退栈取出放到数组里,可以发现,先取出的是较小的(因为其绝对值较大,而又是负的,所以值是较小的),然后再根据排好的顺序,将正的数依次放到数组里,ok了。
题意:排序。。
解题思路:很简单的一道题,用个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 ; }
相关文章推荐
- E题hdu 1425 sort
- hdu1425 sort (朴素)
- hdu 1425 sort
- HDU-1425-sort
- hdu 1425 sort
- hdu 1425.sort
- hdu 1425 sort
- sort 1425 hdu(hash 和 sort排序)
- hdu 1425:sort(排序,经典题。快排模板)
- HDU 1425 sort(快速排序)
- HDU - 1425——sort
- HDU 1425:sort
- hdu 1425 sort hash
- hdu 1425 sort
- hdu 1425 sort
- heap sort(hdu 1425)
- HDU 1425 Sort
- HDU1425:sort(哈希思想!)
- hdu 1425 sort
- HDU 1425 sort