Go语言的sort包内置了四种算法:插入排序,堆排序,快速排序,归并排序。不过刚学,也不会自己实现接口,现在需要获取排序前的索引:也就是排序后的数组元素在排序前的什么位置。插入排序比较简单,就用插入排序实现一下。
只要在排序函数里面生命一个自然数递增的索引数组,在对原数组排序的时候顺便给索引数组也排序一下,然后返回这个[]int的索引就好了。
(都用切片操作(不是数组))
package main import ( "fmt" ) // 排序的同时返回其排序前索引 func sort(array []float64) []int { var n int = len(array) var index []int for i := 0; i < n; i++ { index = append(index, i) } // fmt.Println(index) // fmt.Println("数组array的长度为:", n) if n < 2 { return nil } for i := 1; i < n; i++ { // fmt.Printf("检查第%d个元素%f ", i, array[i]) var temp float64 = array[i] var tempIndex = index[i] var k int = i - 1 for k >= 0 && array[k] > temp { k-- } for j := i; j > k+1; j-- { array[j] = array[j-1] index[j] = index[j-1] } // fmt.Printf("其位置为%d ", k+1) array[k+1] = temp index[k+1] = tempIndex } return index } func main() { var array []float64 = []float64{3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48} var index []int = sort(array) fmt.Println(array) fmt.Println(index) }
结果:
排序后的数组:[2 3 4 5 15 19 26 27 36 38 44 46 47 48 50]
排序前的位置:[9 0 11 3 5 12 7 8 6 2 1 10 4 14 13]