go泛型实现排序

191 阅读1分钟

go泛型实现排序

常用类型 int | int8 | int16 | int32 | int64 | float32 | float64 | string

实现

type SortType interface {
    int | int8 | int16 | int32 | int64 | float32 | float64 | string
}

//冒泡排序
func bubbleSort[T SortType](array []T, reverse ...bool) {
    for i := 0; i < len(array); i++ {
        for j := 0; j < len(array)-i-1; j++ {
            if reverse != nil && reverse[0] {
                if array[j] < array[j+1] {
                    array[j], array[j+1] = array[j+1], array[j]
                }
            } else {
                if array[j] > array[j+1] {
                    array[j], array[j+1] = array[j+1], array[j]
                }
            }
        }
    }
}

// quickSort 快速排序
func quickSort[T SortType](array []T, reverse ...bool) {
    if len(array) <= 1 {
        return
    }
    // 选择一个基准值
    pivot := array[0]
    // 定义两个切片
    var left, right []T
    // 循环遍历
    for i := 1; i < len(array); i++ {
        if reverse != nil && reverse[0] {
            if array[i] > pivot {
                left = append(left, array[i])
            } else {
                right = append(right, array[i])
            }
        } else {
            if array[i] < pivot {
                left = append(left, array[i])
            } else {
                right = append(right, array[i])
            }
        }
    }
    if reverse != nil && reverse[0] {
        quickSort(left, true)
        quickSort(right, true)
    } else {
        quickSort(left, false)
        quickSort(right, false)
    }
    copy(array, append(append(left, pivot), right...))
}