Golang ile Sıralama Algoritmaları

GoLangGolang dilinde ARRAY yapılarında FOR ile gezinirken aklıma bir diziye nasıl veri ekleyebilirim sorusu geldi.

Meğer bu durum slice konusuymuş ama olsun 🙂

var sayilar[] int

ile oluşturulan diziye

sayilar = append (sayilar,3)

şeklinde ekleme yapabiliyormuşuz. Bunu öğrendikten sonra bu sefer x boyutlu bir diziye rastgele sayı eklesem nasıl olur sorusu geldi ve bu kodu oluşturdum.

func CreateArray(size int) ([]int, time.Duration) {
	start := time.Now()
	var sayilar []int

	rand.Seed(time.Now().UnixNano())

	for i := 0; i < size; i++ {
		rnd := randInt(0, size)
		sayilar = append(sayilar, rnd)
	}
	elapsed := time.Since(start)

	return sayilar, elapsed
}
func randInt(min int, max int) int {
	return min + rand.Intn(max-min)
}

yukarıdaki kod bloğumuzda CreateArray fonksiyonuna verilecek olan size parametresi ile size boyutunda ve 0…size rakam aralığındaki rastgele sayılardan oluşan bir diziyi oluşturup bu işlemin gerçekleştiği süreyle birlikte sonucu alabiliyoruz.

dizi, sure := CreateArray(eleman)

sizin de görebileceğiniz üzere ilk dönen veri dizi(array) yapısıyken ikinci değerimiz bize geçen süreyi time.duration olarak veriyor.
Peki biz bu diziyi oluşturduk, geçen süresini de öğrendik. O zaman temel sıralama algoritmaları ile bu diziyle oynayabiliriz 🙂

Örnek olarak Seçmeli Sıralama (Selection Sort) algoritmasını uygularsak

Kaynak Wikipedia

func SelectionSort(liste []int) ([]int, time.Duration) {
	start := time.Now()
	for i := 0; i < len(liste); i++ {

		for j := i + 1; j < len(liste); j++ {
			if liste[j] < liste[i] {

				liste[i], liste[j] = liste[j], liste[i] 

			}

		}

	}
	elapsed := time.Since(start)

	return liste, elapsed
}

ya da Insertion Sort (Eklemeli Sıralama) algoritmasını uygularsak
Kaynak Wikipedia

func InsertionSort(liste []int) ([]int, time.Duration) {
	start := time.Now()
	for i := 0; i < len(liste); i++ { value := liste[i] j := i - 1 for j >= 0 && liste[j] > value {
			liste[j+1] = liste[j]
			j = j - 1
		}
		liste[j+1] = value

	}
	elapsed := time.Since(start)

	return liste, elapsed
}

Peki bunları yaptık ama aradaki farkı nasıl görebiliriz?

import (
	"fmt"
	"math/rand"
	"time"
)

func CreateArray(size int) ([]int, time.Duration) {
	start := time.Now()
	var sayilar []int

	rand.Seed(time.Now().UnixNano())

	for i := 0; i < size; i++ {
		rnd := randInt(0, size)
		sayilar = append(sayilar, rnd)
	}
	elapsed := time.Since(start)

	return sayilar, elapsed
}
func randInt(min int, max int) int {
	return min + rand.Intn(max-min)
}

func main() {
	eleman := 500000
	dizi, sure := CreateArray(eleman)
	
	fmt.Printf("%v Elemanlı dizi oluşturma süresi : %v\n", eleman, sure)
	fmt.Println("*******************************************************")
	dizi, sure = SelectionSort(dizi)
	fmt.Printf("Selection Sort (Süre:%v): \n", sure)
	fmt.Println("*******************************************************")
	dizi, sure = InsertionSort(dizi)

	fmt.Printf("Insertion Sort (Süre:%v): \n", sure)
	fmt.Println("*******************************************************")
}

func SelectionSort(liste []int) ([]int, time.Duration) {
	start := time.Now()
	for i := 0; i < len(liste); i++ {

		for j := i + 1; j < len(liste); j++ {
			if liste[j] < liste[i] {

				liste[i], liste[j] = liste[j], liste[i] 

			}

		}

	}
	elapsed := time.Since(start)

	return liste, elapsed
}

func InsertionSort(liste []int) ([]int, time.Duration) {
	start := time.Now()
	for i := 0; i < len(liste); i++ {

		value := liste[i]
		j := i - 1

		for j >= 0 && liste[j] > value {
			liste[j+1] = liste[j]
			j = j - 1
		}
		liste[j+1] = value

	}
	elapsed := time.Since(start)

	return liste, elapsed
}

Örnek olarak 500000 elemanlı ve 0..500000 sayıları arasındaki değerlerden random olarak oluşturulan bir sayı dizisi için yukarıdaki sıralama algoritmalarını çalıştırdığımızda ekran görüntüsü aşağıdaki gibi olacaktır.

D:\Projeler\Go>go run main.go
500000 Elemanlı dizi oluşturma süresi : 21.3532ms
*******************************************************
Selection Sort (Süre:6m35.4840526s): 
*******************************************************
Insertion Sort (Süre:0s):
*******************************************************

sizin de görebileceğiniz üzere 500000 elemanlı dizinin rastgele sayılardan oluşturulma süresi 21.3532ms ve bu dizinin Seçmeli Sıralama algoritması ile sıralanması 6 dakika 35 saniye sürerken aynı dizinin Insertion Sort (Eklemeli Sıralama) ile sıralanması 0s sürmüştür.