1. 程式人生 > 其它 >二分查詢及常用排序演算法:golang實現

二分查詢及常用排序演算法:golang實現

技術標籤:Go演算法

1、二分查詢:

輸入是一個有序的元素列表。如果要查詢的元素包含在列表中,二分查詢返回其位置;否則返回空。

二分查詢時間複雜度:O(logn)

對於包含n個元素的列表,用二分查詢最多需要lognlogn

二分查詢演算法golang實現:

//二分查詢演算法
func binary_search(list []int, item int) int {
	low := 0
	high := len(list) - 1   //low,high用於跟蹤要在其中查詢的部分
	for low <= high {    //只要範圍沒有縮小到只有一個元素。
		mid := (low + high) / 2     //取陣列中間值
		guess := list[mid]
		if guess == item {          //找到了元素
			return mid
		} else if guess > item {    //猜的數字大了
			high = mid - 1
		} else if guess < item {    //猜的數字小了
			low = mid + 1
		}
	}
	return -1         //沒有指定的元素返回-1
}

Example:

二維有序陣列,行和列都是遞增的,找出某一個數
/* 對每行使用二分查詢,此情況下的演算法複雜度為O(nlogn) */


func searchNumber(nums [][]int, elem int) (int, int) {
	for i := 0; i < len(nums); i++ {
		index := binary_search(nums[i], elem)
		if index != -1 {
			fmt.Println(i+1, "行", index+1, "列")
			return i, index
		}
	}
	return -1, -1
}

2、選擇排序

選擇排序是一種簡單直觀的排序演算法, 時間複雜度:O(n²)適用於資料規模較小的情況。唯一的好處可能就是不佔用額外的記憶體空間了吧。

1. 演算法步驟

首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。

再從剩餘未排序元素中繼續尋找最小(大)元素,然後放到已排序序列的末尾。

重複第二步,直到所有元素均排序完畢。

//選擇排序
func slectionSort(nums []int) []int {
	newNums := []int{}
	length := len(nums)
	for i := 0; i < length; i++ {
		smallestIndex := findSmallest(nums)
		newNums = append(newNums, nums[smallestIndex])
		nums = append(nums[:smallestIndex], nums[smallestIndex+1:]...) //把最小值剔除掉,對剩餘的元素進行排序
	}
	fmt.Println("newNums", newNums)
	return newNums
}

遍歷查詢陣列中的最小值索引:(時間複雜度為O(n))

func findSmallest(nums []int) int {
	smallest := nums[0]
	smallestIndex := 0
	for index, elem := range nums {
		if elem < smallest {
			smallest = elem
			smallestIndex = index
		}
	}
	return smallestIndex
}

3、快速排序

4、歸併排序