Go语言数据结构和算法(二十二)计数排序算法

21 阅读2分钟

计数排序是一种排序算法.它通过计算数组中每个唯一元素的出现次数对数组元素进行排序.计数存储在辅助数组中.排序是通过将计数映射为辅助数组的索引完成的.

1.使用场景:

对大型数组进行排序:

计数排序算法可以线性时间复杂度对大型数据集进行排序.

对有限范围内的数字进行排序:

当整数范围已知且有限时.计数排序算法效果最佳.

稳定排序:

是一种稳定的排序算法.它保持输入数组中相等元素的相对顺序.

2.实现:

2.1方法:


func CountSort(array []int) []int {
	count := makeRange(0, findMax(array))
	//计数.
	for _, value := range array {
		count[value] += 1
	}
	for i := 1; i < len(count); i++ {
		//下边是从0开始.统一加一.
		count[i] += count[i-1]
	}

	//复制到正确的位置.往指定索引放入元素.
	res := make([]int, len(array))
	for i := 0; i < len(array); i++ {
		e := array[i]
		t := count[e] - 1
		res[t] = e
		count[e] = count[e] - 1
	}
	return res
}

func findMax(array []int) int {
	var temp int
	temp = array[0]
	for _, e := range array {
		if temp < e {
			temp = e
		}
	}
	return temp
}

func makeRange(min, max int) []int {
	a := make([]int, max-min+1)
	for i := range a {
		a[i] = 0
	}
	return a
}

******2.2main方法:

	array := []int{33, 23, 56, 7, 8, 18, 99, 28}
	countSort := data.CountSort(array)
	fmt.Println(countSort)
}

3.实战:

3.1方法:

	bucket := make([]int, 100, 100)
	for _, item := range real {
		bucket[item-1] += 1
	}
	//整理排序后的切片.
	sort := make([]int, 0, len(real))
	for index := range bucket {
		flag := bucket[index]
		for i := 0; i < flag; i++ {
			sort = append(sort, index+1)
		}
	}
	//比较排序好的.和未排序的.
	ret := 0
	for index := range real {
		if sort[index] != real[index] {
			ret = ret + 1
		}
	}
	return ret
}

3.2main方法:

	array := []int{1, 6, 8, 1, 6, 6}
	countSort := data.CheckHeight(array)
	fmt.Println(countSort)
}

***用手拨开浮沉.那是万千繁华.






如果大家喜欢我的分享的话.可以关注我的微信公众号

念何架构之路