例如,在 Golang 中使用 sort.Slice 對切片進行排序很容易
func sortAll(nums []int) {
sort.Slice(nums, func(i, j int) bool {
if nums[i] < nums[j] {
return true
} else {
return false
}
})
}
輸入:[]int{2, 0, 1, 0, 1, 2, 2, 2}
輸出:[0 0 1 1 2 2 2 2]
它作業得很好。
但是,如果我想從某個特定位置對切片進行排序,這意味著我只想對切片的一部分進行排序。我使用了這段代碼:
func sortPartly(nums []int, p int) {
sort.Slice(nums[p:], func(i, j int) bool {
if nums[i] < nums[j] {
return true
} else {
return false
}
})
}
使用相同的輸入,我sortPartly(nums, 1)將開始排序的位置設定為 1。我得到的輸出[2 0 1 1 2 2 2 0]不是按順序排列的nums[1],輸出應該是[2 0 0 1 1 2 2 2]
經過一番除錯,我碰巧在下面寫了這段代碼,它就像我想要的那樣作業。但我不明白為什么這段代碼有效
func sortPartly(nums []int, p int) {
sort.Slice(nums[p:], func(i, j int) bool {
if nums[i p] < nums[j p] {
return true
} else {
return false
}
})
}
我有一個玩具代碼來節省您的時間,誰能幫我解釋為什么這個代碼有效。去游樂場
uj5u.com熱心網友回復:
這是從問題中起作用的代碼:
func sortPartly(nums []int, p int) {
sort.Slice(nums[p:], func(i, j int) bool {
if nums[i p] < nums[j p] {
return true
} else {
return false
}
})
}
此函式對切片進行排序nums[p:]。此切片與 共享一個支持陣列nums,但對該支持陣列中的元素使用不同的索引。索引 0 處的元素位于索引pin處nums。索引 1 處的元素位于索引p 1in處nums,依此類推。因為 sort.Slice 在切片中使用索引nums[p:]并且匿名函式參考切片nums,所以匿名函式必須通過添加來調整索引p。
通過宣告要排序的切片來消除索引調整。在匿名函式中參考該切片。
func sortPartly(nums []int, p int) {
t := nums[p:]
sort.Slice(t, func(i, j int) bool {
if t[i] < t[j] {
return true
} else {
return false
}
})
}
請注意,它t與nums. 排序對t中的元素進行排序nums。
額外建議:將構造簡化if boolValue { return true } else { return false }為return boolValue.
func sortPartly(nums []int, p int) {
t := nums[p:]
sort.Slice(t, func(i, j int) bool {
return t[i] < t[j]
})
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/506629.html
上一篇:嘗試在JavaScript中不使用sort()對陣列進行排序
下一篇:意外的結果
