其他分享
首页 > 其他分享> > 排序(冒泡,选择,插入,快速)

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

作者:互联网

排序

冒泡排序

func BubbleSort(s []int)[]int{
	for i := 0; i < len(s); i ++ {
		for j := i + 1; j < len(s); j ++{
			if s[i] > s[j]{
				s[i],s[j] = s[j],s[i]
			}
		}
	}
	return s
}

选择排序

选择是排序也属于内部排序法,是从欲排序的数据中,按指定的规则选出某一元素,经过和其他元素重整,再依原则交换位置后达到排序目的。

第一次从R[0]-R[n-1]中选出最小值,与R[0]交换,第二次从R[1]-R[n-1]中选取最小值,与R[1]交换,第三次从R[2]-R[n-1]中选取最小值,与R[2]交换,...,第i次从R[i-1]-R[n-1]中选取最小值,与R[i-1]进行交换,...,第n-1次从R[n-2]~R[n-1]中选取最小值,与R[n-2]交换,总共通过n-1次,得到一个按排序码从小到大排序的有序序列。

func SelectSort(s []int)[]int{
	for i := 0; i < len(s) - 1; i ++ {
		// 先假设arr[0]为最小值
		min := s[i]
		minIndex := i

		// 遍历后面1—[len(s)-1]比较
		for j := i + 1; j < len(s); j ++ {
			if min > s[j] {
				// 找到真正的最大值
				min = s[j]
				minIndex = j
			}
		}
		// 交换操作
		if minIndex != i {
			s[i], s[minIndex] = s[minIndex],s[i]
		}
	}
	return s
}

插入排序

插入式排序也属于内部排序法,是对于欲排序的元素以插入的方式找寻该元素的适当位置,以达到排序的目的。

把n个待排序的元素看成为一个有序表和一个无需表,开始时,有序表中只包含一个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,把它的排序码一次与有序表元素的排序码进行比较,将它插入到有序表中的适当位置,使之成为新的有序表。

func InsertSort(s []int)[]int{
	// 完成第一次,给第二个元素找到合适的位置并插入
	for i := 1; i < len(s); i ++ {
		insertVal := s[i]
		insertIndex := i - 1

		// 从小到大
		for insertIndex >= 0 && s[insertIndex] > insertVal{
			s[insertIndex + 1] = s[insertIndex]
			insertIndex --
		}
		// 插入
		if insertIndex + 1 != i {
			s[insertIndex + 1] = insertVal
		}
	}

	return s
}

快速排序

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

// left 表示数组左边的下标
// right 表示数组右边的下标
// array B小时要排序的数组
func QuickSort(left, right int, s []int){
	l := left
	r := right
	// p 是中轴,支点
	p := s[(l+r)/2]

	//for循环的目的是将比p小的数放到左边,比p大的数放到右边
	for; l < r;{
		// 从p的左边找到大于等于p的值
		for;s[l] < p;{
			l ++
		}
		// 从p的右边找到小于p的值
		for;s[r] > p;{
			r --
		}
		// l >= r 表明本次分解任务完成,break
		if l >= r {
			break
		}
		// 交换
		s[l],s[r] = s[r],s[l]

		// 优化
		if s[l] == p {
			r --
		}
		if s[r] == p {
			l ++
		}
	}
	// 如果l == r, 再移动下
	if l == r{
		l ++
		r --
	}
	// 向左递归
	if left < r{
		QuickSort(left,r, s)
	}
	// 向右递归
	if right > l {
		QuickSort(l,right,s)
	}
}

标签:insertIndex,++,元素,len,插入,int,冒泡,排序
来源: https://www.cnblogs.com/huiyichanmian/p/14463211.html