二分查詢及常用排序演算法:golang實現
阿新 • • 發佈:2020-12-28
1、二分查詢:
輸入是一個有序的元素列表。如果要查詢的元素包含在列表中,二分查詢返回其位置;否則返回空。
二分查詢時間複雜度:
對於包含n個元素的列表,用二分查詢最多需要
二分查詢演算法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、歸併排序