排序

xiaoxiao2025-09-14  73

//插入 func Insert(arr []int) { for i := 1; i < len(arr); i++ { tmp := arr[i] end := i - 1 //找插入位置&搬移 for ; end >= 0; end-- { if tmp < arr[end] { arr[end+1] = arr[end] } else { break } } arr[end+1] = tmp } } //插入-二分法 func Insert_Binary(arr []int) { for i := 1; i < len(arr); i++ { tmp := arr[i] left := 0 right := i - 1 end := right //二分法找插入位置 for left <= right { mid := (left + right) / 2 if arr[mid] > tmp { right = mid - 1 } else { left = mid + 1 } } //搬移 for idx := end; idx >= left; idx-- { arr[idx+1] = arr[idx] } arr[left] = tmp } } //希尔 func ShellSort(arr []int) { gap := len(arr) for gap > 1 { gap = gap / 3 + 1 for idx := gap; idx < len(arr); idx++ { //把要插入的元素先保存一份 tmp := arr[idx]; end := idx - gap; //比较、找插入位置&搬移 for end >= 0 && arr[end] > tmp { arr[end + gap] = arr[end]; end = end - gap; } //插入元素 arr[end + gap] = tmp; } } } //选择 func Select(arr []int){ for idx := 0; idx < len(arr); idx++ { min := idx for i := idx + 1; i<len(arr); i++ { if arr[i] < arr[min]{ min = i } } arr[idx],arr[min] = arr[min],arr[idx] } } //堆排 最后一个有孩子的结点的idx = (size-2)/2 func heapAdjust(arr []int, root int, size int){ parent := root child := root * 2 + 1 for child < size{ if child + 1 < size && arr[child+1] > arr[child]{ child = child +1 } if arr[child] > arr[parent]{ arr[child], arr[parent] = arr[parent], arr[child] parent = child child = parent * 2 + 1 } else { break } } } func HeapSort(arr []int){ //建堆(大)--->升序 size := len(arr) for i := (size-2)/2; i >=0 ; i-- { heapAdjust(arr,i,size) } //排序 pos := size -1 for pos > 0 { arr[0], arr[pos] = arr[pos], arr[0] size-- heapAdjust(arr, 0, size) pos-- } } //冒泡 func Bubble(arr []int){ size := len(arr) for i := 0; i < size-1; i++ { for j := 0; j < size-i-1; j++{ if arr[j] > arr[j+1]{ arr[j], arr[j+1] = arr[j+1],arr[j] } } } } //快排 func Partion(arr []int, left int, right int)int{ cur := left prev := cur - 1 key := arr[right] for cur <= right{ if arr[cur] < key { prev++ if prev != cur{ arr[prev], arr[cur] = arr[cur], arr[prev] } } cur++ } prev++ if arr[prev] > arr[right]{ arr[prev], arr[right] = arr[right], arr[prev] } return prev } func QuickSort(arr []int, left int, right int){ if (left < right) { div := Partion(arr, left, right) QuickSort(arr, left, div - 1) QuickSort(arr, div + 1, right) } } func QuickSort_NoRecursion(arr []int, size int){ 定义栈:s 右边界:size - 1入栈 左边界:0入栈 for s != empty() { left := s.top() s.pop() right := s.top() s.pop() if left < right { div := Partion(arr, left, right) s.push(right) s.push(div + 1) s.push(div - 1) s.push(left) } } } //鸽巢问题----数组arr[100],9900<arr[idx]<10000,对数组进行排序 func CountSort(arr []int, size int) { minVal := arr[0] maxVal := arr[0] //统计数组中的最大和最小元素 for i := 0; i < size; i++ { if arr[i] < minVal { minVal = arr[i] } if arr[i] > maxVal { maxVal = arr[i] } } fmt.Println(minVal) fmt.Println(maxVal) //make切片存放每个元素出现的次数,切片长度:part = maxVal - minVal + 1 part := maxVal - minVal + 1 var tmp = make([]int, part) //统计每个元素出现的个数 for i := 0; i < size; i++ { tmp[arr[i]-minVal]++ } fmt.Println(tmp) //重新排序 idx := 0 for i := 0; i < part; i++ { for j := 0; j < tmp[i]; j++ { arr[idx] = i + minVal idx++ } } } //归并 func Merge(arr []int, left int, mid int, right int) { begin1 := left end1 := mid begin2 := mid+1 end2 := right tmp := make([]int,len(arr)) idx := left for begin1 <= end1 && begin2 <= end2 { if arr[begin1] > arr[begin2] { tmp[idx] = arr[begin2] begin2++ } else { tmp[idx] = arr[begin1] begin1++ } idx++ } for begin1 <= end1 { tmp[idx] = arr[begin1] begin1++ idx++ } for begin2 <= end2 { tmp[idx] = arr[begin2] begin2++ idx++ } //将排过序的拷贝至arr,以便下次merge时做比较 for i := left; i < idx; i++ { arr[i] = tmp[i] } } func _Merge(arr []int, left int, right int) { if left < right { mid := (left+right) / 2 _Merge(arr, left, mid) _Merge(arr, mid+1, right) Merge(arr, left, mid, right)//归并 } } func MergeSort(arr []int) { size := len(arr) left := 0 right := size - 1 _Merge(arr, left, right) }
转载请注明原文地址: https://www.6miu.com/read-5036281.html

最新回复(0)