0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

バケツソートの実装

Last updated at Posted at 2024-12-08

この記事は「大分高専 Advent Calendar 2024」9日目の記事です.

はじめに

絶賛テスト期間中の高専生,S2108です.アルゴリズムのテストにバケットソートの穴埋め問題が出てきたので,復習の意味も込めてC言語で実装してみました.バケツソートとも呼ぶらしいです.どんなソートかの説明は省略します.勝手に調べてください.
初記事です!

C言語での実装

main.c
#include<stdio.h>
#define MAX 10

void bucket_sort(int number[], int num_of_item){
  int i,buckets[MAX];

  for (i = 0; i < MAX; i++)
  { // バケツを用意する
    buckets[i] = 0;
  }

  for (i = 0; i < num_of_item; i++)
  { // 元のデータをバケツに入れる
    buckets[number[i]] = number[i];
  }

  int j=0;
  for (i = 0; i < MAX; i++)
  { // バケツから元の配列に戻す
    if (0 < buckets[i]) number[j++] = buckets[i];
  }
  
}
int main(void) {
  int numbers[] = {3,5,6,2,7,1};
  int length = sizeof(numbers)/sizeof(numbers[0]);
  // length : 配列の長さ
  
  printf("before : ");
  for (int i = 0; i < length; i++) printf("%d ",numbers[i]);
  printf("\n");
  
  bucket_sort(numbers,length);

  printf("after : ");
  for (int i = 0; i < length; i++) printf("%d ",numbers[i]);

  printf("\n");
  return 0;
}

bucket_sort関数には,配列と配列の要素数を渡す.

出力

$ gcc main.c 
$ ./a.out 
before : 3 5 6 2 7 1 
after : 1 2 3 5 6 7 

終わりに

以上バケツソートの実装でした.すごく直感的でわかりやすいソートで,データの個数が少なくて,値が被らない保証がある時には役に立ちそうだなと思いました.
残りのテスト頑張るぞー!

おまけ 〜Goでの実装〜

最近Go言語に興味があるので,Goでも実装してみました.C言語に似てるらしい.

main.go
package main

import (
    "fmt"
)
var MAX = 10

func bucket_sort(number []int) []int{
	var num_of_item = len(number)
	var buckets = make([]int,MAX)
	//make(型,大きさ)

	for i := 0; i < MAX; i++ {
		// バケツを用意する
		buckets[i] = 0
	}
	
	for i := 0; i < num_of_item; i++{
		// 元のデータをバケツに入れる
		buckets[number[i]] = number[i]
	}
  
	var j = 0
	for i := 0; i < MAX; i++ {
		if 0 < buckets[i]{
			number[j] = buckets[i]
			j++
		}
	}
	return number
}
func main() {
	var numbers = []int{3,5,6,2,7,1}

	fmt.Printf("before : ")
	for _, v := range numbers {
		fmt.Printf("%d,",v)
	}
	fmt.Printf("\n")

	numbers = bucket_sort(numbers)
	fmt.Printf("after : ")
	for _, v := range numbers {
		fmt.Printf("%d,",v)
	}
	fmt.Printf("\n")
}

出力

$ go run main.go 
before : 3,5,6,2,7,1,
after : 1,2,3,5,6,7,

C言語に似てるって言われてるけど,変数の宣言とか若干違ってややこしい.勉強します..

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?