Golang - 数据结构之数组

689 阅读1分钟
原文链接: blog.csdn.net

一、无序数组

插入快,查找与删除慢

package main

import "fmt"

type Array struct {
	StrArray []string
	Size     int
}

func NewArray(size int) *Array {
	return &Array{StrArray: make([]string, size)}
}

func (arr *Array) Add(item string) {
	arr.StrArray[arr.Size] = item
	arr.Size++
}

func (arr *Array) Find(item string) int {
	var index = -1
	for i := 0; i < arr.Size; i++ {
		if arr.StrArray[i] == item {
			index = i
			break
		}
	}
	return index
}

func (arr *Array) Del(item string) bool {
	if index := arr.Find(item); index != -1 {
		for i := index; i < arr.Size-1; i++ {
			arr.StrArray[i] = arr.StrArray[i+1]
		}
		arr.Size--
		return true
	}
	return false
}

func main() {
	newArr := NewArray(10)

	newArr.Add("123")
	newArr.Add("456")

	fmt.Print(newArr.StrArray)
}

二、有序数组

查找快,插入与删除慢

package main

import "fmt"

type Array struct {
	StrArray []string
	Size     int
}

func NewArray(size int) *Array {
	return &Array{StrArray: make([]string, size)}
}

func (arr *Array) Add(item string) {
	var insertPos = arr.Size - 1
	for insertPos >= 0 && arr.StrArray[insertPos] > item {
		arr.StrArray[insertPos + 1] = arr.StrArray[insertPos]
		insertPos--
	}
	arr.StrArray[insertPos + 1] = item
	arr.Size++
}

func (arr *Array) Find(item string) int {
	var start, end = 0, arr.Size - 1
	var mid int

	if end < 0 {
		return -1
	}

	for {
		mid = int((start + end) / 2)

		if item == arr.StrArray[mid] {
			return mid
		}

		if mid == start {
			if item == arr.StrArray[end] {
				return end
			} else {
				return -1
			}
		}

		if item < arr.StrArray[mid] {
			end = mid
		} else {
			start = mid
		}
	}
}

func (arr *Array) Del(item string) bool {
	if index := arr.Find(item); index != -1 {
		for i := index; i < arr.Size-1; i++ {
			arr.StrArray[i] = arr.StrArray[i+1]
		}
		arr.Size--
		return true
	}
	return false
}

func main() {
	newArr := NewArray(10)

	newArr.Add("123")
	newArr.Add("456")
	newArr.Add("234")

	fmt.Print(newArr.StrArray)
	fmt.Print(newArr.Find("456"))
}