go 数据结构与算法

本文介绍了几种常见的排序算法,包括冒泡排序、选择排序、插入排序、快速排序、希尔排序和归并排序。通过交互式程序,用户可以输入数据并选择排序算法,直观地看到排序过程和结果。这些排序算法是计算机科学中的基础知识,对于理解和优化数据处理至关重要。
摘要由CSDN通过智能技术生成

一、排序算法

       排序算法有比较多种,其中快速排序基本上是经常被提问到算法。在这个代码中,有冒泡排序、插入排序、选择排序、希尔排序、归并排序、快速排序。其中在控制台与用户进行交互,用户输入对应的数据,选择对应的排序,即可是实现排序的效果。

package main

import "fmt"

// 冒泡
func maopao(arr []int) []int {
	len_num := len(arr)
	fmt.Println(arr)
	for i := 0; i < len_num; i++ {
		for j := 0; j < len_num-i-1; j++ {
			if arr[j] > arr[j+1] {
				arr[j], arr[j+1] = arr[j+1], arr[j]
			}
		}
	}
	return arr
}

// 选择
func xuanzhe(arr []int) []int {
	len_num, min_index := len(arr), 0
	for i := 0; i < len_num; i++ {
		min_index = i
		for j := i; j < len_num; j++ {
			if arr[j] < arr[min_index] {
				min_index = j
			}
		}
		arr[i], arr[min_index] = arr[min_index], arr[i]
	}
	return arr
}

// 插入排序
func charu(arr []int) []int {
	len_num := len(arr)
	for i := 1; i < len_num; i++ {
		flag := arr[i]
		for j := i - 1; j >= 0; j-- {
			if flag < arr[j] {
				arr[j], arr[j+1] = arr[j+1], arr[j]
			} else {
				arr[j+1] = flag
				break
			}
		}
	}
	return arr
}

// 快排
func partition(arr []int, left int, right int) int {
	tmp := arr[left]
	for left < right {
		for left < right && arr[right] >= tmp {
			right -= 1
		}
		arr[left] = arr[right]
		for left < right && arr[left] <= tmp {
			left += 1
		}
		arr[right] = arr[left]
	}
	arr[left] = tmp
	return left
}

func kuaipai(arr []int, left int, right int) []int {
	if left < right {
		mid := partition(arr, left, right)
		kuaipai(arr, left, mid-1)
		kuaipai(arr, mid+1, right)
	}
	return arr
}

// 希尔排序
func insert_sort_gap(arr []int, gap int) {
	for i := gap; i < len(arr); i++ {
		tmp := arr[i]
		j := i - gap
		for j >= 0 && arr[j] > tmp {
			arr[j+gap] = arr[j]
			j -= gap
		}
		arr[j+gap] = tmp
	}
}

func shell_sort(arr []int) []int {
	len_num := len(arr) / 2
	for len_num >= 1 {
		insert_sort_gap(arr, len_num)
		len_num /= 2
	}
	return arr
}

// 归并
func merge(arr []int, low int, mid int, high int) {
	i, j := low, mid+1
	ltmp := make([]int, 0)
	for i <= mid && j <= high {
		if arr[i] < arr[j] {
			ltmp = append(ltmp, arr[i])
			i += 1
		} else {
			ltmp = append(ltmp, arr[j])
			j += 1
		}
	}
	for i <= mid {
		ltmp = append(ltmp, arr[i])
		i += 1
	}
	for j <= high {
		ltmp = append(ltmp, arr[j])
		j += 1
	}
	for _, v := range ltmp {
		arr[low] = v
		low += 1
	}
}

func merge_sort(arr []int, low int, high int) []int {
	if low < high {
		mid := (low + high) / 2
		merge_sort(arr, low, mid)
		merge_sort(arr, mid+1, high)
		merge(arr, low, mid, high)
	}
	return arr
}

func main() {

	var arr []int
	fmt.Println("输入您的数字, -1结束输入")
	for {
		var line int
		_, _ = fmt.Scanf("%d", &line)
		if line != -1 && line != 0 {
			arr = append(arr, line)
		} else if line == 0 {
			continue
		} else {
			break
		}
	}
	// 输入您要的排序
	fmt.Println("输入您的排序, 1:冒泡, 2:选择, 3:插入, 4:快排, 5:希尔, 6:归并")
	var sort_num string
	for {
		_, _ = fmt.Scanf("%s", &sort_num)
		if sort_num != "" {
			break
		}
	}
	switch sort_num {
	case "1":
		arr1 := maopao(arr)
		fmt.Println(arr1)
	case "2":
		arr1 := xuanzhe(arr)
		fmt.Println(arr1)
	case "3":
		arr1 := charu(arr)
		fmt.Println(arr1)
	case "4":
		left, right := 0, len(arr)-1
		arr1 := kuaipai(arr, left, right)
		fmt.Println(arr1)
	case "5":
		arr1 := shell_sort(arr)
		fmt.Println(arr1)
	case "6":
		low, high := 0, len(arr)-1
		arr1 := merge_sort(arr, low, high)
		fmt.Println(arr1)
	default:
		fmt.Println("结束")
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值