Golangはよく使われる6つのソートアルゴリズムを実現します
32867 ワード
Golangを使用して、次のソートアルゴリズムを実装します.バブルソート 選択ソート 挿入ソート クイックソート 集計ソート スタックソート
大屋根で実現
github: GolangBasicSortAlgorithm/SortAlgorithm.go
starに間違いがあったら指摘してください.
しゅかんすう
package main
import (
"fmt"
"math/rand"
"sort"
"time"
)
const (
num = 10000 //
rangeNum = 100000 //
)
func main() {
arr := GenerateRand()//
//
org_arr := make([]int, num)
copy(org_arr, arr)
//
//Bubble(arr)
//
//SelectSort(arr)
//
//InsertSort(arr)
//
//QuickSort(arr, 0, len(arr)-1)
//
//MergeSort(arr, 0, len(arr)-1)
//
//HeapSort(arr)
sort.Ints(org_arr) // sort
//fmt.Println(arr, org_arr, IsSame(arr, org_arr))
// 15 ,
fmt.Println(arr[:15], org_arr[:15], IsSame(arr, org_arr))
}
//
func GenerateRand() []int {
randSeed := rand.New(rand.NewSource(time.Now().Unix() + time.Now().UnixNano()))
arr := make([]int, num)
for i := 0; i < num; i++ {
arr[i] = randSeed.Intn(rangeNum)
}
return arr
}
//
func IsSame(slice1, slice2 []int) bool {
if len(slice1) != len(slice2) {
return false
}
if (slice1 == nil) != (slice2 == nil) {
return false
}
for i, num := range slice1 {
if num != slice2[i] {
return false
}
}
return true
}
バブルソート
func Bubble(arr []int) {
size := len(arr)
var swapped bool
for i := size - 1; i > 0; i-- {
swapped = false
for j := 0; j < i; j++ {
if arr[j+1] < arr[j] {
arr[j], arr[j+1] = arr[j+1], arr[j]
swapped = true
}
}
if swapped != true {
break
}
}
}
ソートの選択
func SelectSort(arr []int) {
for i := 0; i < len(arr)-1; i++ {
for j := i + 1; j <= len(arr)-1; j++ {
if arr[j] < arr[i] {
arr[j], arr[i] = arr[i], arr[j]
}
}
}
}
ソートの挿入
func InsertSort(arr []int) {
for i := 1; i <= len(arr)-1; i++ {
for j := i; j > 0; j-- {
if arr[j-1] > arr[j] {
arr[j-1], arr[j] = arr[j], arr[j-1]
}
}
}
}
クイックソート
func QuickSort(arr []int, l, r int) {
if l < r {
pivot := arr[r]
i := l - 1
for j := l; j < r; j++ {
if arr[j] <= pivot {
i++
arr[j], arr[i] = arr[i], arr[j]
}
}
i++
arr[r], arr[i] = arr[i], arr[r]
QuickSort(arr, l, i-1)
QuickSort(arr, i+1, r)
}
}
集計ソート
//
func Merge(arr []int, l, mid, r int) {
//
n1, n2 := mid-l+1, r-mid
left, right := make([]int, n1), make([]int, n2)
copy(left, arr[l:mid+1])
copy(right, arr[mid+1:r+1])
i, j := 0, 0
k := l
for ; i < n1 && j < n2; k++ {
if left[i] <= right[j] {
arr[k] = left[i]
i++
} else {
arr[k] = right[j]
j++
}
}
for ; i < n1; i++ {
arr[k] = left[i]
k++
}
for ; j < n2; j++ {
arr[k] = right[j]
k++
}
}
//
func MergeSort(arr []int, l, r int) {
if l < r {
mid := (l + r - 1) / 2
MergeSort(arr, l, mid)
MergeSort(arr, mid+1, r)
Merge(arr, l, mid, r)
}
}
ヒープのソート
大屋根で実現
//
func adjust_heap(arr []int, i, size int) {
if i <= (size-2)/2 {
//
l, r := 2*i+1, 2*i+2
m := i
if l < size && arr[l] > arr[m] {
m = l
}
if r < size && arr[r] > arr[m] {
m = r
}
if m != i {
arr[m], arr[i] = arr[i], arr[m]
adjust_heap(arr, m, size)
}
}
}
//
func build_heap(arr []int) {
size := len(arr)
//
for i := (size - 2) / 2; i >= 0; i-- {
adjust_heap(arr, i, size)
}
}
func HeapSort(arr []int) {
size := len(arr)
build_heap(arr)
for i := size - 1; i > 0; i-- {
// arr[0] ,
arr[0], arr[i] = arr[i], arr[0]
adjust_heap(arr, 0, i)
}
}
完全なコードファイル:
github: GolangBasicSortAlgorithm/SortAlgorithm.go
starに間違いがあったら指摘してください.