解题思路
- 先根据arr2对arr1进行排序
- arr1的元素是要比arr2多或是相等的,根据arr2排完序后arr1后半段会有一段无序的小尾巴
- 再对小尾巴进行排序
代码
func relativeSortArray(arr1 []int, arr2 []int) []int {
if arr1 == nil || len(arr1) == 1 {
return arr1
}
l1 := len(arr1)
l2 := len(arr2)
n := 0
// 已经排好序的不在参与排序
for i := 0; i < l2 ; i++ {
m := i + n
for j := m; j < l1; j++ {
if arr2[i] == arr1[j] {
swap(arr1,m,j)
//break
m++
n++
}
}
n--
}
//fmt.Printf("%v",arr1)
//fmt.Println(n)
// 选择排序
sort(arr1,l1,l2 + n)
return arr1
}
// x不能等于Y
//func swap(arr1 []int,x, y int) {
// arr1[x] = arr1[x] ^ arr1[y]
// arr1[y] = arr1[x] ^ arr1[y]
// arr1[x] = arr1[x] ^ arr1[y]
//}
func swap(arr1 []int,x, y int) {
temp := arr1[x]
arr1[x] = arr1[y]
arr1[y] = temp
}
// 让数组在[l2,l1]之间排序
func sort(arr []int,l1,l2 int) {
for i := l2; i < l1 - 1; i++ {
min := i
for j := i + 1 ; j < l1; j++ {
if arr[min] > arr[j] {
min = j
}
}
swap(arr,i,min)
}
}