归并排序&快速排序

归并排序

package sort

import (
	"fmt"
)

func MergesSort(data []int) {

	MergeSplit(data, 0, len(data)-1)

}

func MergeSplit(data []int, startIndex, endIndex int) {
	if startIndex == endIndex {
		return
	}

	middleIndex := (startIndex + endIndex) / 2

	MergeSplit(data, startIndex, middleIndex)
	MergeSplit(data, middleIndex+1, endIndex)
	MergeData(data, startIndex, middleIndex, endIndex)

}

func MergeData(data []int, startIndex, middleIndex, endIndex int) {
	tmpArray := make([]int, endIndex-startIndex+1)
	tmpArrayInsertIndex := 0
	leftIndex := startIndex
	rightIndex := middleIndex + 1

	for leftIndex <= middleIndex && rightIndex <= endIndex {
		if data[leftIndex] <= data[rightIndex] {
			tmpArray[tmpArrayInsertIndex] = data[leftIndex]
			leftIndex++
		} else if data[rightIndex] <= data[leftIndex] {
			tmpArray[tmpArrayInsertIndex] = data[rightIndex]
			rightIndex++
		}
		tmpArrayInsertIndex++
	}

	start := leftIndex
	end := middleIndex
	if rightIndex <= endIndex {
		start = rightIndex
		end = endIndex
	}

	// 把最后的数据写会到 tmp 最后
	for start <= end {
		tmpArray[tmpArrayInsertIndex] = data[start]
		tmpArrayInsertIndex++
		start++
	}

	for i := 0; i <= endIndex-startIndex; i++ {
		data[startIndex+i] = tmpArray[i]
	}

}

快速排序

package sort

func QuickSoft(data []int) {
	QuickSoftC(data, 0, len(data)-1)
}
func QuickSoftC(data []int, startIndex, endIndex int) {
	if startIndex >= endIndex {
		return
	}
	i := Partition(data, startIndex, endIndex)

	// 为什么是 i-1 和 i+1 呢?
	// 因为序列被分为了三分, 小于i的,i, 大于i的
	// 因为i 已经在序列中是正确的位置了,就不需要排序了。
	// 就把 小于 i 的和大于 i 的排序即可,所以就是 i-1 和 i+1
	QuickSoftC(data, startIndex, i-1)
	QuickSoftC(data, i+1, endIndex)

}

func Partition(data []int, startIndex, endIndex int) int {
	// 选择最后一位做比对值
	pivot := data[endIndex]
	i := startIndex

	// 数据开始比对排列,只拍到endIndex-1的下标为止。为啥捏?
	for j := startIndex; j <= endIndex-1; j++ {
		if data[j] < pivot {
			data[i], data[j] = data[j], data[i]
			i++
		}
	}

	// 因为最后一个是留给 pivot 的值和 i 的值互换的
	data[i], data[endIndex] = data[endIndex], data[i]

	// 返回比对值的下标
	return i
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值