void radix_sort(vector<int> &array, int n) { int d = max_bit(array, n); int *tmp = new int[n]; int *count = new int[10]; int k = 0; int radix = 1; for (int i = 1; i <= d; i++) { for (int j = 0; j < 10; j++) count[j] = 0; for (int j = 0; j < n; j++) { k = (array[j] / radix) % 10; count[k]++; } for (int j = 1; j < 10; j++) count[j] = count[j-1] + count[j]; for (int j = n-1; j >= 0; j--) { k = (array[j] / radix) % 10; tmp[count[k]-1] = array[j]; count[k]--; } for (int j = 0; j < n; j++) array[j] = tmp[j]; print(array); radix = radix * 10; } delete [] tmp; delete [] count; }
my_bool _nisam_read_pack_info(N_INFO *info, pbool fix_keys) { File file; int diff_length; uint i,trees,huff_tree_bits,rec_reflength,length; uint16 *decode_table,*tmp_buff; ulong elements,intervall_length; char *disk_cache,*intervall_buff; uchar header[32]; ISAM_SHARE *share=info->s; BIT_BUFF bit_buff; DBUG_ENTER("_nisam_read_pack_info"); if (nisam_quick_table_bits < 4) nisam_quick_table_bits=4; else if (nisam_quick_table_bits > MAX_QUICK_TABLE_BITS) nisam_quick_table_bits=MAX_QUICK_TABLE_BITS; file=info->dfile; my_errno=0; if (my_read(file,(byte*) header,sizeof(header),MYF(MY_NABP))) { if (!my_errno) my_errno=HA_ERR_END_OF_FILE; DBUG_RETURN(1); } if (memcmp((byte*) header,(byte*) nisam_pack_file_magic,4)) { my_errno=HA_ERR_WRONG_IN_RECORD; DBUG_RETURN(1); } share->pack.header_length=uint4korr(header+4); share->min_pack_length=(uint) uint4korr(header+8); share->max_pack_length=(uint) uint4korr(header+12); set_if_bigger(share->base.pack_reclength,share->max_pack_length); elements=uint4korr(header+16); intervall_length=uint4korr(header+20); trees=uint2korr(header+24); share->pack.ref_length=header[26]; rec_reflength=header[27]; diff_length=(int) rec_reflength - (int) share->base.rec_reflength; if (fix_keys) share->rec_reflength=rec_reflength; share->base.min_block_length=share->min_pack_length+share->pack.ref_length; if (!(share->decode_trees=(DECODE_TREE*) my_malloc((uint) (trees*sizeof(DECODE_TREE)+ intervall_length*sizeof(byte)), MYF(MY_WME)))) DBUG_RETURN(1); intervall_buff=(byte*) (share->decode_trees+trees); length=(uint) (elements*2+trees*(1 << nisam_quick_table_bits)); if (!(share->decode_tables=(uint16*) my_malloc((length+512)*sizeof(uint16)+ (uint) (share->pack.header_length+7), MYF(MY_WME | MY_ZEROFILL)))) { my_free((gptr) share->decode_trees,MYF(0)); DBUG_RETURN(1); } tmp_buff=share->decode_tables+length; disk_cache=(byte*) (tmp_buff+512); if (my_read(file,disk_cache, (uint) (share->pack.header_length-sizeof(header)), MYF(MY_NABP))) { my_free((gptr) share->decode_trees,MYF(0)); my_free((gptr) share->decode_tables,MYF(0)); DBUG_RETURN(1); } huff_tree_bits=max_bit(trees ? trees-1 : 0); init_bit_buffer(&bit_buff,disk_cache, (uint) (share->pack.header_length-sizeof(header))); /* Read new info for each field */ for (i=0 ; i < share->base.fields ; i++) { share->rec[i].base_type=(enum en_fieldtype) get_bits(&bit_buff,4); share->rec[i].pack_type=(uint) get_bits(&bit_buff,4); share->rec[i].space_length_bits=get_bits(&bit_buff,4); share->rec[i].huff_tree=share->decode_trees+(uint) get_bits(&bit_buff, huff_tree_bits); share->rec[i].unpack=get_unpack_function(share->rec+i); } skipp_to_next_byte(&bit_buff); decode_table=share->decode_tables; for (i=0 ; i < trees ; i++) read_huff_table(&bit_buff,share->decode_trees+i,&decode_table, &intervall_buff,tmp_buff); decode_table=(uint16*) my_realloc((gptr) share->decode_tables, (uint) ((byte*) decode_table - (byte*) share->decode_tables), MYF(MY_HOLD_ON_ERROR)); { my_ptrdiff_t diff=PTR_BYTE_DIFF(decode_table,share->decode_tables); share->decode_tables=decode_table; for (i=0 ; i < trees ; i++) share->decode_trees[i].table=ADD_TO_PTR(share->decode_trees[i].table, diff, uint16*); } /* Fix record-ref-length for keys */ if (fix_keys) { for (i=0 ; i < share->base.keys ; i++) { share->keyinfo[i].base.keylength+=(uint16) diff_length; share->keyinfo[i].base.minlength+=(uint16) diff_length; share->keyinfo[i].base.maxlength+=(uint16) diff_length; share->keyinfo[i].seg[share->keyinfo[i].base.keysegs].base.length= (uint16) rec_reflength; } } if (bit_buff.error || bit_buff.pos < bit_buff.end) { /* info_length was wrong */ my_errno=HA_ERR_WRONG_IN_RECORD; my_free((gptr) share->decode_trees,MYF(0)); my_free((gptr) share->decode_tables,MYF(0)); DBUG_RETURN(1); } DBUG_RETURN(0); }