2020-08-18 17:29:42 +08:00
|
|
|
|
/*
|
|
|
|
|
|
* @Author : huangzj
|
|
|
|
|
|
* @Time : 2020/8/18 14:11
|
|
|
|
|
|
* @Description:Lomuto划分,找到一个数组中第k个小的元素.这边只是提供一个示例,具体类型可以根据该算法进行修改
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
package search
|
|
|
|
|
|
|
2020-11-09 16:24:20 +08:00
|
|
|
|
var (
|
|
|
|
|
|
times = 0 //用来计算一次划分进行了多少次的比较操作
|
|
|
|
|
|
charge = 0 //实际进行元素交换的次数
|
|
|
|
|
|
)
|
|
|
|
|
|
|
2020-08-18 17:29:42 +08:00
|
|
|
|
//参数说明:
|
|
|
|
|
|
//list :数组
|
|
|
|
|
|
//start : 开始比较的数字下标
|
|
|
|
|
|
//end :结束比较的数字下标
|
|
|
|
|
|
//作用说明:
|
2020-08-20 09:28:35 +08:00
|
|
|
|
func LomutoPartition(list []int, start int, end int) int {
|
2020-08-18 17:29:42 +08:00
|
|
|
|
moveSubscript := start
|
|
|
|
|
|
compareValue := list[start]
|
|
|
|
|
|
for i := start + 1; i <= end; i++ {
|
|
|
|
|
|
if list[i] < compareValue {
|
|
|
|
|
|
moveSubscript++
|
2020-11-09 16:24:20 +08:00
|
|
|
|
charge++
|
2020-08-18 17:29:42 +08:00
|
|
|
|
list[moveSubscript], list[i] = list[i], list[moveSubscript]
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2020-11-09 16:24:20 +08:00
|
|
|
|
charge++
|
2020-08-18 17:29:42 +08:00
|
|
|
|
list[moveSubscript], list[start] = list[start], list[moveSubscript] //交换元素
|
|
|
|
|
|
return moveSubscript
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2020-11-09 16:24:20 +08:00
|
|
|
|
func LomutoQuiteSelect(list []int, pointPosition int) (int, int, int) {
|
2020-08-18 17:29:42 +08:00
|
|
|
|
positionCheck(pointPosition, len(list)) //下标校验
|
2020-11-09 16:24:20 +08:00
|
|
|
|
times = 0
|
|
|
|
|
|
charge = 0
|
2020-08-18 17:29:42 +08:00
|
|
|
|
|
2020-08-20 09:28:35 +08:00
|
|
|
|
nowPosition := LomutoPartition(list, 0, len(list)-1)
|
2020-11-09 16:24:20 +08:00
|
|
|
|
times++
|
2020-08-18 17:29:42 +08:00
|
|
|
|
//循环进行lomuto划分处理,知道找到我们需要的那个位置的元素
|
|
|
|
|
|
for nowPosition != pointPosition-1 {
|
2020-11-09 16:24:20 +08:00
|
|
|
|
times++
|
2020-08-18 17:29:42 +08:00
|
|
|
|
if nowPosition > pointPosition-1 {
|
2020-08-20 09:28:35 +08:00
|
|
|
|
nowPosition = LomutoPartition(list, 0, nowPosition)
|
2020-08-18 17:29:42 +08:00
|
|
|
|
} else {
|
2020-08-20 09:28:35 +08:00
|
|
|
|
nowPosition = LomutoPartition(list, nowPosition+1, len(list)-1)
|
2020-08-18 17:29:42 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2020-11-09 16:24:20 +08:00
|
|
|
|
return list[nowPosition], times, charge
|
2020-08-18 17:29:42 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func positionCheck(pointPosition int, len int) {
|
|
|
|
|
|
if pointPosition <= 0 || pointPosition > len {
|
|
|
|
|
|
panic("查询的元素下标不能小于0,或者大于数组长度")
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|