排序算法

Posted njy2

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了排序算法相关的知识,希望对你有一定的参考价值。

package main

import (
	"fmt"
	"strconv"
)

func main() {
	arr := []int{12, 34, 651, 3, 65, 1, 4}
	fmt.Println(arr)
	// 冒泡排序
	// value := bubble_sort(arr)
	// 选择排序
	// value := selection_sort(arr)
	// 插入排序
	// value := insertion_sort(arr)
	// 快速排序
	// value := quick_sort(arr)
	// 归并排序
	// value := merge_sort(arr)
	// 希尔排序
	// value := shell_sort(arr)
	// 计数排序
	// value := count_sort(arr)
	// 桶排序
	// 基数排序
	value := radix_sort(arr)
	fmt.Println(value)
}

// 冒泡排序
func bubble_sort(arr []int) []int {
	len := len(arr)
	for i := 0; i < len-1; i++ {
		for j := 0; j < len-i-1; j++ {
			if arr[j] > arr[j+1] {
				arr[j], arr[j+1] = arr[j+1], arr[j]
			}
		}
	}
	return arr
}

// 选择排序
func selection_sort(arr []int) []int {
	len := len(arr)
	for i := 0; i < len-1; i++ {
		for j := i + 1; j < len; j++ {
			if arr[i] > arr[j] {
				arr[i], arr[j] = arr[j], arr[i]
			}
		}
	}
	return arr
}

// 插入排序
func insertion_sort(arr []int) []int {
	len := len(arr)
	// fmt.Println(len)
	for i := 1; i < len; i++ {
		if arr[i] < arr[i-1] {
			a := arr[i]
			arr[i] = arr[i-1]
			j := i - 1 - 1
			for {
				if a >= arr[j] {
					break
				}
				arr[j+1] = arr[j]
				j = j - 1
				if j < 0 {
					break
				}
			}
			arr[j+1] = a
		}
	}
	return arr
}

// 快速排序
func quick_sort(arr []int) []int {
	len := len(arr)
	if len < 2 {
		return arr
	}
	key := arr[0]
	left := make([]int, 0)
	right := make([]int, 0)
	for i := 1; i < len; i++ {
		if arr[i] < key {
			left = append(left, arr[i])
		} else {
			right = append(right, arr[i])
		}
	}
	left = quick_sort(left)
	right = quick_sort(right)

	return append(append(left, key), right...)
}

// 归并排序
func merge_sort(arr []int) []int {
	len := len(arr)
	if len < 2 {
		return arr
	}
	m := len / 2
	// fmt.Println(m)
	left := arr[:m]
	right := arr[m:]
	// fmt.Println(left)
	// fmt.Println(right)
	left = merge_sort(left)
	right = merge_sort(right)
	return merge(left, right)
}
func merge(left, right []int) []int {
	res := make([]int, 0)
	for len(left) > 0 && len(right) > 0 {
		if left[0] > right[0] {
			res = append(res, right[0])
			right = right[1:]
		} else {
			res = append(res, left[0])
			left = left[1:]
		}
	}
	for len(left) > 0 {
		res = append(res, left[0])
		left = left[1:]
	}
	for len(right) > 0 {
		res = append(res, right[0])
		right = right[1:]
	}
	return res
}

// 希尔排序
func shell_sort(arr []int) []int {
	len := len(arr)
	f := 3
	h := 1
	for h < len/f {
		h = f*h + 1
	}
	// fmt.Println(h)
	for h >= 1 {
		// fmt.Println("h = ", h)
		for i := h; i < len; i++ {
			// fmt.Println(i)
			for j := i; j >= h; j -= h {
				// fmt.Println("j = ", j)
				if arr[j] < arr[j-h] {
					arr[j], arr[j-h] = arr[j-h], arr[j]
				}

			}
		}
		h = h / f
	}
	return arr
}

// 计数排序
func count_sort(arr []int) []int {
	len := len(arr)
	if len < 2 {
		return arr
	}
	max := arr[0]
	for i := 1; i < len; i++ {
		if arr[i] > max {
			max = arr[i]
		}
	}
	res := make([]int, max+1)
	// fmt.Println(res)
	for _, v := range arr {
		res[v] = res[v] + 1
	}
	NewArr := make([]int, 0)
	for k, v := range res {
		for i := 0; i < v; i++ {
			NewArr = append(NewArr, k)
		}
	}
	return NewArr
}

// 基数排序
func radix_sort(arr []int) []int {
	kl := make([][]int, 10)
	// fmt.Println(kl)
	// lenArr := len(arr)
	max := arr[0]
	for _, v := range arr {
		if max < v {
			max = v
		}
	}
	str := strconv.Itoa(max)
	lenStr := len(str)
	// fmt.Println(lenStr)
	for i := 0; i < lenStr; i++ {
		for _, v := range arr {
			strV := strconv.Itoa(v)
			lenV := len(strV)
			if lenV > i {
				k := strV[lenV-i-1 : lenV-i]
				key, _ := strconv.Atoi(k)
				kl[key] = append(kl[key], v)
			} else {
				kl[0] = append(kl[0], v)
			}

		}
		// fmt.Println(kl)
		arr = arr[0:0]
		for k, v := range kl {
			arr = append(arr, v...)
			kl[k] = kl[k][0:0]
		}
	}

	return arr
}

  

以上是关于排序算法的主要内容,如果未能解决你的问题,请参考以下文章

算法排序之堆排序

快速排序-递归实现

从搜索文档中查找最小片段的算法?

在第6731次释放指针后双重免费或损坏

TimSort算法分析

以下代码片段的算法复杂度