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; }