void bucket_sort(int arr[], int arr_len){
	int buckets[BUCKET_NUM][BUCKET_SIZE] = {0};//注意每个桶的大小要大于等于放入该桶中的数据个数

	int i, j, k;
	int bucket_index;
	int max = arr[0];
	int min = arr[0];

	/* 找出最大值、最小值,计算每个桶的范围 */
	for(i = 1; i < arr_len; i++){
		min = min <= arr[i] ? min : arr[i];
		max = max >= arr[i] ? max : arr[i];
	}
	double range = (max - min + 1)/BUCKET_NUM;
	printf("-----max = %d\n", max);
	printf("-----min = %d\n", min);
	printf("-----range = %f\n", range);

	//遍历,将值分到对应的桶中
	for(i = 0; i < arr_len; i++){
		bucket_index = (int)((arr[i] - min)/range);//计算每个值应该放在第几个桶
		if(bucket_index >= BUCKET_NUM){//避免索引超过桶的个数
			bucket_index = BUCKET_NUM - 1;
		}
		printf("------bucket_index = %d,	push data : %d\n", bucket_index, arr[i]);

		for(j = 0; j < BUCKET_SIZE; j++){//如果有多个值放入同一个桶中,避免覆盖,应向后追加
			if(buckets[bucket_index][j] == 0){//不等于0,表示给位置上没有值
				buckets[bucket_index][j] = arr[i];
				break;
			}							
		}
	}

	k = 0;
	int bucket_real_len = 0;
	//桶内作排序,排好序的值对应放回原数组
	for(i = 0; i < BUCKET_NUM; i++){//若每个桶中的值不止一个,需要在该桶内做一个排序
		bucket_real_len = 0;
		for(j = 0; j < BUCKET_SIZE; j++){//计算该桶中有几个值
			if(buckets[i][j] == 0){
				break;
			}else{
				bucket_real_len++;
			}
		}
		sort(buckets[i], bucket_real_len);//这里采用冒泡排序

		//将排好序的值 放入原数组中对应的位置
		for(j = 0; j < BUCKET_SIZE; j++){
			if(buckets[i][j] == 0){
				break;
			}else{
				arr[k++] = buckets[i][j];
			}
		}
		//清理桶中的数据,若是动态分配的内存,需要清理数据
		clear_arr(buckets[i], bucket_real_len);
	}
}
int main(int argc, char **argv){
    char line[MAX];
    int found = 0;

    if(argc != 2)
        printf("Usage: find pattern\n");
    else {
        while(getline_x(line,MAX) > 0){
            clear_arr(line);
            if(strstr(line, *(argv+1)) != NULL){
                printf("%s", line);
                found++;
            }
        }
    }
    return found;
}