排序算法题

package code

func BinSearch(nums []int, target int) int {
	left := 0
	right := len(nums) - 1
	for left <= right {
		mid := (right + left) / 2
		switch {
		case nums[mid] == target:
			return mid
		case nums[mid] > target:
			right = mid - 1
		case nums[mid] < target:
			left = mid + 1
		}
	}
	return -1
}

func QuickSort(arr []int) []int {
	count := len(arr)
	if count <= 1 {
		return arr
	}
	var left []int
	var right []int
	base := arr[0]
	for i := 1; i < count; i++ {
		if arr[i] < base {
			left = append(left, arr[i])
		} else {
			right = append(right, arr[i])
		}
	}
	left = append(QuickSort(left), base)
	left = append(left, QuickSort(right)...)
	return left
}

func QuickSortV2(sortArray []int, left, right int) {
	if left < right {
		key := sortArray[(left+right)/2]
		i := left
		j := right

		for {
			for sortArray[i] < key {
				i++
			}
			for sortArray[j] > key {
				j--
			}
			if i >= j {
				break
			}
			sortArray[i], sortArray[j] = sortArray[j], sortArray[i]
		}

		QuickSortV2(sortArray, left, i-1)
		QuickSortV2(sortArray, j+1, right)
	}
}

// 选择排序
func SelectSort(a []int) {
	n := len(a)
	for i := 0; i < n-1; i++ {
		k := i
		for j := i + 1; j < n; j++ {
			if a[j] < a[k] {
				k = j
			}
		}
		a[i], a[k] = a[k], a[i]
	}
}

// 插入排序
func InsertionSort(a []int) {
	n := len(a)
	for i := 1; i < n; i++ {
		temp := a[i]
		j := i - 1
		for ; j >= 0 && a[j] > temp; j-- {
			a[j+1] = a[j]
		}
		a[j+1] = temp
	}
}

// 希尔排序
func ShellSort(a []int) {
	n := len(a)
	for d := n / 2; d >= 1; d /= 2 {
		for i := d; i < n; i++ {
			temp := a[i]
			j := i - d
			for ; j >= 0 && a[j] > temp; j -= d {
				a[j+d] = a[j]
			}
			a[j+d] = temp
		}
	}
}

// 合并一次
func mergeOne(a []int, b []int, n int, len int) {
	i := 0
	for i+len < n {
		j := i + 2*len - 1
		if j >= n {
			j = n - 1
		}
		m := i
		k := i
		l := i + len
		for i < k+len && l <= j {
			if a[i] <= a[l] {
				b[m] = a[i]
				m++
				i++
			} else {
				b[m] = a[l]
				m++
				l++
			}
		}
		for i < k+len {
			b[m] = a[i]
			m++
			i++
		}
		for l <= j {
			b[m] = a[l]
			m++
			l++
		}
		i = j + 1
	}
	if i < n {
		for ; i < n; i++ {
			b[i] = a[i]
		}
	}
}

func MergeSort(a []int) {
	n := len(a)
	b := make([]int, n)
	_len := 1
	flag := 0
	for _len < n {
		if flag == 0 {
			mergeOne(a, b, n, _len)
		}
		if flag == 1 {
			mergeOne(b, a, n, _len)
		}
		flag = 1 - flag
		_len *= 2
	}
	if flag == 1 {
		for i := 0; i < n; i++ {
			a[i] = b[i]
		}
	}
}

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

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值