毎回新しい発見があるので、プログラム言語って奥が深いですよね。
そして、重要だと感じたのは、自分の書き方が間違っているかどうか、もっといい書き方があるのかどうかを、仕事などでは、レビューをしてもらえる環境の人も多いかもしれませんが、それがいかに贅沢な環境かということがよくわかりました。
できるだけ人のソースコードを普段から読んで勉強しなければいけませんね。
ソース
#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
たくさんのプログラム言語でアルゴリズム学習
0 件のコメント:
コメントを投稿