[アルゴリズム] バケットソート(C言語編)

2017年4月12日

C言語 テクノロジー プログラミング 特集

毎回新しい発見があるので、プログラム言語って奥が深いですよね。 そして、重要だと感じたのは、自分の書き方が間違っているかどうか、もっといい書き方があるのかどうかを、仕事などでは、レビューをしてもらえる環境の人も多いかもしれませんが、それがいかに贅沢な環境かということがよくわかりました。 できるだけ人のソースコードを普段から読んで勉強しなければいけませんね。

ソース

#include <stdio.h> void bucketSort(int *numbers , int numbersCount){ int bucket[numbersCount]; int max = 0; for(int i=0; i<numbersCount; i++){ if(bucket[numbers[i]] == 0){ bucket[numbers[i]] = 0; } bucket[numbers[i]]++; if(max < numbers[i]){ max = numbers[i]; } } int arr[numbersCount]; int num = 0; for(int i=0; i<=max; i++){ if( i > numbersCount || bucket[i] == 0){continue;} for(int j=0; j<bucket[i]; j++){ arr[num] = i; num++; } } for(int i=0; i<numbersCount; i++){ numbers[i] = arr[i]; } } void arrayView(int *nums , int numsCount){ for (int i=0; i<numsCount; i++) { printf("%d \n",nums[i]); } } int main(void){ int numbers[] = {1,1,3,2,4,6,1,2,4,6}; int numbersCount = (sizeof numbers / sizeof numbers[0]); bucketSort(numbers , numbersCount); arrayView(numbers , numbersCount); return 0; }

実行

$ gcc -o bucketSort.cp bucketSort.c $ ./bucketSort.cp 1 1 1 2 2 3 4 4 6 6

解説

ポインタの扱い

C言語は関数に配列をやり取りする時は、ポインタを使うのが定石のようなのですが、 for(int i=0; i<numbersCount; i++){ numbers[i] = arr[i]; } という風に、一度仮登録した変更後の配列データをloopを使って上書きしているのは numbers = arr; という記述ができなかったから・・・もっと簡単に書けるのかな?まだC言語になれない・・・

配列定義

今回は、配列数が決まっているため、定義の時に、配列の要素数をセットしています。 int bucket[numbersCount]; メモリ確保のため、できるだけこうした書き方をした方がいいようですね。・

関連リンク

wikipedia たくさんのプログラム言語でアルゴリズム学習

このブログを検索

ごあいさつ

このWebサイトは、独自思考で我が道を行くユゲタの少し尖った思考のTechブログです。 毎日興味がどんどん切り替わるので、テーマはマルチになっています。 もしかしたらアイデアに困っている人の助けになるかもしれません。