冒泡(bubblesort)、选择排序、插入排序、快速排序

冒泡排序(bubblesort)

特点:通过换位置的方式,一直向上冒泡

package main

import "fmt"

func bubbleSortAsc(arrayA []int){
    for i:=0; i < len(arrayA); i++ {
    	for j:=0; j < len(arrayA)-1-i; j++ {
    		if arrayA[j] > arrayA[j+1]{
        		arrayA[j], arrayA[j+1] = arrayA[j+1], arrayA[j]
			}
    	}
    }
    fmt.Println(arrayA)    
}

func bubbleSortDesc(arrayA []int){
	for i:=0; i < len(arrayA); i++{
		for j:=0; j < len(arrayA)-1-i; j++{
			if arrayA[j] < arrayA[j+1]{
				arrayA[j], arrayA[j+1] = arrayA[j+1], arrayA[j]
			}
		}
	}
	fmt.Println(arrayA)
}

func main(){
	var arrayA []int = []int{1,3,5,2,9,10,6,4,8,7}
	bubbleSortAsc(arrayA)
	bubbleSortDesc(arrayA)
}

快速排序(quicksort)

基本思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分都要小,然后再按此方法对两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列

复杂度:快速排序是最不稳定的算法,最坏的时间复杂度是O(n2),最好的时间复杂度是 nlogn,空间复杂度是O(logn)

demo:

package main

import "fmt"

func QuickSort(aSlice []int, start, end int) {
	if start >= end {
		return
	}

	var low, high = start, end  //low 为由左向右的游标, high为由右向左的游标
	var mid = aSlice[start]  // 基数

	for low < high {
		//如果 low 与 high 未重合,high指向的元素不比基准元素小,则high往左移动
		for low < high && aSlice[high] >= mid {
			high--
		}
		aSlice[low] = aSlice[high]

		//如果 low 与 high 未重合,low指向的元素不比基准元素小,则low往右移动
		for low < high && aSlice[low] < mid {
			low ++
		}
		aSlice[high] = aSlice[low]
	}

	//将基准元素放到该位置
	aSlice[low] = mid
	//对基准元素左边的子序列进行快速排序
	QuickSort(aSlice, start, low - 1)
	//对基准元素右边的子序列进行快速排序
	QuickSort(aSlice, low + 1, end)
}

func main (){
	var aSlice = []int{2,5,4,6,9,8,10,1,3,7}
	QuickSort(aSlice, 0, len(aSlice) - 1)
	fmt.Println(aSlice)
}

python 版本:

# coding: utf8

def quick_sort(alist, start, end):
    if start >= end:
        return

    # low为由左向右的游标, high为由右向左的游标
    low = start
    high = end
    mid = alist[start]  # 基数

    while low < high:
        # 如果 low 与 high 未重合,high指向的元素不比基准元素小,则high往左移动
        while low < high and alist[high] >= mid:
            high -= 1
        alist[low] = alist[high]

        # 如果 low 与 high 未重合,low指向的元素不比基准元素小,则low往右移动
        while low < high and alist[low] < mid:
            low += 1
        alist[high] = alist[low]

    # 将基准元素放到该位置
    alist[low] = mid
    # 对基准元素左边的子序列进行快速排序
    quick_sort(alist, start, low - 1)
    # 对基准元素右边的子序列进行快速排序
    quick_sort(alist, low + 1, end)


if __name__ == '__main__':
    # alist = [2, 5, 4, 6, 9, 7, 8, 1, 10, 3]
    alist = [6, 5, 8, 2, 9, 4, 10, 1, 3, 7]
    quick_sort(alist, 0, len(alist) - 1)
    print(alist)

插入排序(insertsort)

像打扑克牌时的抓牌,第一张牌是不需要插入的,第二张牌开始就需要插入了,根据习惯,这里是从右往左看,小的一直往左边挪,一旦确认位置就退出循环(去抓下一张牌)

package main

import "fmt"

func insertSortAsc(arrayA []int){
    for i:=1; i < len(arrayA); i++ {
    	for j:=i; j > 0; j-- {
    		fmt.Println(arrayA[j])
    		if arrayA[j-1] > arrayA[j]{
        		arrayA[j-1], arrayA[j] = arrayA[j], arrayA[j-1]
			} else {
				break
			}
    	}
    	
    }
    fmt.Println(arrayA)    
}

func insertSortDesc(arrayA []int){
	for i:=1; i < len(arrayA); i++{
		for j:=i; j > 0; j--{
			if arrayA[j-1] < arrayA[j]{
				arrayA[j-1], arrayA[j] = arrayA[j], arrayA[j-1]
			} else {
				break
			}
		}
	}
	fmt.Println(arrayA)
}

func main(){
	var arrayA []int = []int{3,1,5,2,9,10,6,4,8,7}
	insertSortAsc(arrayA)
	insertSortDesc(arrayA)
}

  

  

  

每天都要遇到更好的自己.
原文地址:https://www.cnblogs.com/kaichenkai/p/10982490.html