一、冒泡排序 type bubbleSort []int
func (s bubbleSort) Sort() { for i := 0; i < len(s)-1; i++ { for j:=len(s)-1; j > i; j-- { if s[j] < s[j-1] { s[j], s[j-1] = s[j-1], s[j] } } } }
二、选择排序
type selectSort []int
func (s selectSort) Sort() { for i := 0; i < len(s) - 1; i++ { min := i for j := i + 1; j < len(s); j ++ { if s[j] < s[min] { min = j } } s[min], s[i] = s[i], s[min] } }
三、快速排序
type quickSort []int
func (s quickSort) Sort() { s.binarySort(0, len(s)-1) }
func (s quickSort) binarySort(start, end int) { if start >= end { return } temp := s[start] i := start j := end for i < j { for ;s[j] > temp && i < j; j--{} if i >= j { break } s[i] = s[j] i++ for ;s[i] <= temp && i < j; i++{} if i >= j { break } s[j] = s[i] j-- } s[i] = temp s.binarySort(start, i-1) s.binarySort(i+1, end) }
四、插入排序
type insertSort []int
func (s insertSort) Sort() { for i := 1; i < len(s); i++ { temp := s[i] for j := 0; j < i; j ++ { if s[j] > temp { for k := i; k > j; k-- { s[k] = s[k-1] } s[j] = temp break } } } }
五、希尔排序
type shellSort []int
func (s shellSort) Sort() { l := len(s) for step := l / 2; step > 0; step = step/2 { for offset := 0; offset < step; offset++ { for i := offset + step; i < l; i+=step { temp := s[i] j := i - step for ; j >= 0; j -= step { if s[j] < temp { break } } for k := i; k > j+step; k -= step { s[k] = s[k - step] } s[j + step] = temp } } } }
六、基数排序
type radixSort []int
func (s radixSort) Sort() { if len(s) == 0 { return } max := s[0] for i := 1; i < len(s); i++ { if s[i] > max { max = s[i] } } for radix := 1; radix < max; radix *= 10 { s.bucketSort(radix) } }
func (s radixSort) bucketSort(radix int) { l := len(s) var bucketSize [10]int temp := make([]int, l) for _,v := range s { bucketSize[(v/radix)%10]++ } for i := 1; i < 10; i++ { bucketSize[i] += bucketSize[i-1] } for i := l - 1; i >= 0; i-- { v := s[i] temp[bucketSize[(v/radix)%10]-1] = v bucketSize[(v/radix)%10]-- } for i := 0; i < l; i++ { s[i] = temp[i] } }
七、归并排序
type mergeSort []int
func (s mergeSort) Sort() { s.part(0, len(s)-1) }
func (s mergeSort) part(start, end int) { if start >= end { return } mid := (start+end)/2 s.part(start, mid) s.part(mid+1, end) s.merge(start, mid, end) }
func (s mergeSort) merge(start, mid, end int) { temp := make([]int, end-start+1) pos := 0 lc := start rc := mid+1 for lc <= mid && rc <= end { if s[lc] < s[rc] { temp[pos] = s[lc] lc++ } else { temp[pos] = s[rc] rc++ } pos++ } for lc <= mid { temp[pos] = s[lc] lc++ pos++ } for rc <= end { temp[pos] = s[rc] rc++ pos++ } pos = 0 for i := start; i<=end; i++ { s[i] = temp[pos] pos++ } }
八、堆排序
type heapSort []int
func (s heapSort) Sort() { end := len(s) - 1 if end <= 0 { return } s.BuildMaxHeap(end) for i := 0; i < end; { s[0], s[end - i] = s[end - i], s[0] i++ s.DownToLeaf(0, end - i) } }
func (s heapSort) BuildMaxHeap(end int) { if end <= 0 { return } root := (end + 1)/2 - 1 for; root >=0; root-- { s.DownToLeaf(root, end) } }
func (s heapSort) DownToLeaf(root int, end int) { for root*2 + 1 <= end { leaf := root*2 + 1 if leaf + 1 <= end && s[leaf] < s[leaf+1] { leaf++ } if s[root] >= s[leaf] { break } s[root], s[leaf] = s[leaf], s[root] root = leaf } }