internal/quick_select.go (46 lines of code) (raw):
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package internal
func QuickSelect(arr []int64, lo int, hi int, pivot int) int64 {
for hi > 0 {
j := partition(arr, lo, hi)
if j == pivot {
return arr[pivot]
}
if j > pivot {
hi = j - 1
} else {
lo = j + 1
}
}
return arr[pivot]
}
func partition(arr []int64, lo int, hi int) int {
i := lo
j := hi + 1
v := arr[lo]
for {
for arr[i+1] < v {
i++
if i == hi {
break
}
}
i++
for v < arr[j-1] {
j--
if j == lo {
break
}
}
j--
if i >= j {
break
}
x := arr[i]
arr[i] = arr[j]
arr[j] = x
}
x := arr[lo]
arr[lo] = arr[j]
arr[j] = x
return j
}