1.4.2 二维数组的排序

  1. 对于二位素组的排序,可以通过海鲜sort.Interfact接口的方法来处理

  2. 示例:通过数组按照指定规则进行排序,要求:

    1. 给出一个二维数组,将二维数组按第i列(i从1开始)排序;如果第i列相同,则对应的行按第i+1列的元素排序;如果第i+1列的元素也相同,则继续比较第i+2列,以此类推,直到最后一列。如果第i列到最后一列都相同,则按原序列排序

    2. 示例举例:

      给定数组:
      1, 9, 5
      2, 3, 6
      3, 6, 9
      1, 8, 3
      
      按照第2列排序,结果如下:
      2, 3, 6
      3, 6, 9
      1, 8, 3
      1, 9, 5
    3. 代码:

      package main
      
      import (
      	"fmt"
      	"sort"
      )
      
      // ArraySort 按照指定规则对二纬数组进行排序
      func ArraySort(numArray [][]int, firstIndex int) [][]int {
      
      	// 检查
      	if len(numArray) <= 1 {
      		return numArray
      	}
      
      	if firstIndex < 0 || firstIndex > len(numArray[0])-1 {
      		fmt.Println("指定排序行超过数据长度")
      		return numArray
      	}
      
      	// 排序
      	var mIntArray = &IntArray{numArray, firstIndex}
      	sort.Sort(mIntArray)
      	return mIntArray.mArr
      }
      
      type IntArray struct {
      	mArr       [][]int
      	firstIndex int
      }
      
      // Len IntArray实现sort.Interface接口
      func (arr *IntArray) Len() int {
      	return len(arr.mArr)
      }
      
      func (arr *IntArray) Swap(i, j int) {
      	arr.mArr[i], arr.mArr[j] = arr.mArr[j], arr.mArr[i]
      }
      
      func (arr *IntArray) Less(i, j int) bool {
      	arr1 := arr.mArr[i]
      	arr2 := arr.mArr[j]
      	for index := arr.firstIndex; index < len(arr1); index++ {
      		if arr1[index] < arr2[index] {
      			return true
      		} else if arr1[index] > arr2[index] {
      			return false
      		}
      	}
      	return i < j
      }
      
      func main() {
      
      	// 定义一个二维数组
      	nums := [][]int{{1, 9, 5}, {2, 3, 6}, {3, 6, 9}, {1, 8, 3}}
      
      	firstIndex := 2 // 按照第2列排序
      
      	result := ArraySort(nums, firstIndex-1)
      
      	fmt.Println(result)
      
      }

Last updated