#include <stdlib.h>
#include <math.h> /*Для floor*/
#include <string.h> /*Для memset*/
#include <stdio.h>
#include <iostream>
struct list{
double data;
struct list * next;
} ;
struct list * insert_front( struct list * root, int data ) {
struct list * tmp = ( struct list * ) malloc ( sizeof ( struct list) ) ;
if ( tmp ! = NULL ) {
tmp- > data = data;
tmp- > next = root;
root = tmp;
}
return root;
}
struct list * sort( struct list * root) {
struct list * new_root = NULL ;
while ( root ! = NULL ) {
struct list * node = root;
root = root- > next;
if ( new_root == NULL || node- > data < new_root- > data) {
node- > next = new_root;
new_root = node;
} else {
struct list * current = new_root;
while ( current- > next ! = NULL && ! ( node- > data < current- > next- > data) ) {
current = current- > next;
}
node- > next = current- > next;
current- > next = node;
}
}
return new_root;
}
void display( struct list * node) {
for ( ; node ! = NULL ; node = node- > next) printf ( "%d " , node- > data) ;
}
void BucketSort( double a[ ] , int n) {
if ( a == NULL ) return ;
int i, j;
list ** buckets = ( list ** ) malloc ( n* sizeof ( list * ) ) ; /*Массив списков, сейчас содержит мусорок*/
memset ( buckets, 0 , n* sizeof ( list * ) ) ; /*Проинициализируем его*/
/*Вставить элемент a[i] в список buckets[floor(n*a[i])]*/
for ( i = 0 ; i < n; i++ ) {
int j = ( int ) floor ( n* a[ i] ) ;
buckets[ j] = insert_front( buckets[ j] , a[ i] ) ;
}
/*Сортировка всех карманов методом вставок*/
for ( i = 0 ; i < n; i++ ) {
printf ( "\n bucket[%d]:\n " , i) ;
display( buckets[ i] ) ;
buckets[ i] = sort( buckets[ i] ) ;
}
/*Слияние всех карманов в один список*/
j = 0 ;
/*Цикл по всем карманам*/
list * p;
for ( i = 0 ; i < n ; i++ ) {
printf ( "end loop\n " ) ;
putchar ( '\n ' ) ;
if ( buckets[ i] ! = NULL ) {
p = buckets[ i] ;
while ( p ! = NULL ) {
printf ( "bucket[%d]: data %d\n " , i, p- > data) ;
a[ j++ ] = p- > data;
p = p- > next;
}
} else printf ( "bucket[%d] is empty\n " , i) ;
}
}
int main( void ) {
double v[ 10 ] = { 0.3 , 0.1 , 0.71 , 0.4 , 0.1 , 0.2 , 0.7 , 0.8 , 0.5 , 0.6 } ;
BucketSort( v, 10 ) ;
for ( int i = 0 ; i < 10 ; i++ )
std:: cout << v[ i] << " " ;
std:: cout << std:: endl ;
return 0 ;
}
I2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8bWF0aC5oPgkvKtCU0LvRjyBmbG9vciovCiNpbmNsdWRlIDxzdHJpbmcuaD4gLyrQlNC70Y8gbWVtc2V0Ki8KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxpb3N0cmVhbT4KCnN0cnVjdCBsaXN0ewoJZG91YmxlIGRhdGE7CglzdHJ1Y3QgbGlzdCAqbmV4dDsKfTsKCnN0cnVjdCBsaXN0ICogaW5zZXJ0X2Zyb250KHN0cnVjdCBsaXN0ICpyb290LCBpbnQgZGF0YSApewogICAgc3RydWN0IGxpc3QgKnRtcCA9IChzdHJ1Y3QgbGlzdCAqKW1hbGxvYyhzaXplb2Yoc3RydWN0IGxpc3QpKTsKCiAgICBpZih0bXAgIT0gTlVMTCl7CiAgICAgICAgdG1wLT5kYXRhID0gZGF0YTsKICAgICAgICB0bXAtPm5leHQgPSByb290OwogICAgICAgIHJvb3QgPSB0bXA7CiAgICB9CgogICAgcmV0dXJuIHJvb3Q7Cn0KCnN0cnVjdCBsaXN0ICogc29ydChzdHJ1Y3QgbGlzdCAqcm9vdCl7CiAgICBzdHJ1Y3QgbGlzdCAqbmV3X3Jvb3QgPSBOVUxMOwoKICAgIHdoaWxlIChyb290ICE9IE5VTEwpewogICAgICAgIHN0cnVjdCBsaXN0ICpub2RlID0gcm9vdDsKICAgICAgICByb290ID0gcm9vdC0+bmV4dDsKCiAgICAgICAgaWYgKG5ld19yb290ID09IE5VTEwgfHwgbm9kZS0+ZGF0YSA8IG5ld19yb290LT5kYXRhKXsKICAgICAgICAgICAgbm9kZS0+bmV4dCA9IG5ld19yb290OwogICAgICAgICAgICBuZXdfcm9vdCA9IG5vZGU7CiAgICAgICAgfWVsc2V7CiAgICAgICAgICAgIHN0cnVjdCBsaXN0ICpjdXJyZW50ID0gbmV3X3Jvb3Q7CiAgICAgICAgICAgIHdoaWxlIChjdXJyZW50LT5uZXh0ICE9IE5VTEwgJiYgIShub2RlLT5kYXRhIDwgY3VycmVudC0+bmV4dC0+ZGF0YSkpeyAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQtPm5leHQ7CiAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgCgogICAgICAgICAgICBub2RlLT5uZXh0ID0gY3VycmVudC0+bmV4dDsKICAgICAgICAgICAgY3VycmVudC0+bmV4dCA9IG5vZGU7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBuZXdfcm9vdDsKfQoKdm9pZCBkaXNwbGF5KHN0cnVjdCBsaXN0ICpub2RlKXsKICAgIGZvciAoIDsgbm9kZSAhPSBOVUxMOyBub2RlID0gbm9kZS0+bmV4dCkgcHJpbnRmKCIlZCAiLCBub2RlLT5kYXRhKTsKfQoKdm9pZCBCdWNrZXRTb3J0KGRvdWJsZSBhW10sIGludCBuKXsKCWlmKGEgPT0gTlVMTCkgcmV0dXJuOwoJaW50IGksIGo7CglsaXN0ICoqYnVja2V0cyA9IChsaXN0ICoqKW1hbGxvYyhuKnNpemVvZihsaXN0ICopKTsJLyrQnNCw0YHRgdC40LIg0YHQv9C40YHQutC+0LIsINGB0LXQudGH0LDRgSDRgdC+0LTQtdGA0LbQuNGCINC80YPRgdC+0YDQvtC6Ki8KCW1lbXNldChidWNrZXRzLCAwLCBuKnNpemVvZihsaXN0ICopKTsJLyrQn9GA0L7QuNC90LjRhtC40LDQu9C40LfQuNGA0YPQtdC8INC10LPQviovCgkKCS8q0JLRgdGC0LDQstC40YLRjCDRjdC70LXQvNC10L3RgiBhW2ldINCyINGB0L/QuNGB0L7QuiBidWNrZXRzW2Zsb29yKG4qYVtpXSldKi8KCWZvcihpID0gMDsgaSA8IG47IGkrKyl7CgkJaW50IGogPSAoaW50KWZsb29yKG4qYVtpXSk7CgkJYnVja2V0c1tqXSA9IGluc2VydF9mcm9udChidWNrZXRzW2pdLCBhW2ldKTsKCX0KCS8q0KHQvtGA0YLQuNGA0L7QstC60LAg0LLRgdC10YUg0LrQsNGA0LzQsNC90L7QsiDQvNC10YLQvtC00L7QvCDQstGB0YLQsNCy0L7QuiovCglmb3IoaSA9IDA7IGkgPCBuOyBpKyspewoJCXByaW50ZigiXG5idWNrZXRbJWRdOlxuIiwgaSk7CgkJZGlzcGxheShidWNrZXRzW2ldKTsKCQlidWNrZXRzW2ldID0gc29ydChidWNrZXRzW2ldKTsKCX0KCS8q0KHQu9C40Y/QvdC40LUg0LLRgdC10YUg0LrQsNGA0LzQsNC90L7QsiDQsiDQvtC00LjQvSDRgdC/0LjRgdC+0LoqLwoJaiA9IDA7CgkvKtCm0LjQutC7INC/0L4g0LLRgdC10Lwg0LrQsNGA0LzQsNC90LDQvCovCglsaXN0ICpwOwoJZm9yKGkgPSAwOyBpIDwgbiA7IGkrKyl7CgkJcHJpbnRmKCJlbmQgbG9vcFxuIik7CgkJcHV0Y2hhcignXG4nKTsKCQlpZihidWNrZXRzW2ldICE9IE5VTEwpewoJCQlwID0gYnVja2V0c1tpXTsKCQkJd2hpbGUocCAhPSBOVUxMKXsKCQkJCXByaW50ZigiYnVja2V0WyVkXTogZGF0YSAlZFxuIiwgaSwgcC0+ZGF0YSk7CgkJCQlhW2orK10gPSBwLT5kYXRhOwoJCQkJcCA9IHAtPm5leHQ7CgkJCX0KCQl9ZWxzZSBwcmludGYoImJ1Y2tldFslZF0gaXMgZW1wdHlcbiIsIGkpOwoJfQp9CgoKaW50IG1haW4odm9pZCkgewoJZG91YmxlIHZbMTBdID0gezAuMywgMC4xLCAwLjcxLCAwLjQsIDAuMSwgMC4yLCAwLjcsIDAuOCwgMC41LCAwLjZ9OwoKCglCdWNrZXRTb3J0KHYsIDEwKTsKCglmb3IoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykKCQlzdGQ6OmNvdXQgPDwgdltpXSA8PCAiICI7CglzdGQ6OmNvdXQgPDwgc3RkOjplbmRsOwoJcmV0dXJuIDA7Cn0K