开发者学堂课程【Go 语言核心编程 - 数据结构和算法:数据结构和算法-选择排序】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/627/detail/9848
数据结构和算法-选择排序
排序的介绍
排序是将一组数据,依指定的顺序进行排列的过程,常见的排序:
1)冒泡排序
2)选择排序
3)插入排序
4)快速排序
这四种是比较经典的,从速度来看选择排序要快于冒泡排序,插入排序快于选择排序,快速排序是最快的。
冒泡排序
冒泡排序(Bubble Sorting)的基本思想是:通过对待排序序列从后向前(从下标较大的元素开始),依次比较相邻元素的排序码.若发现逆序则交换,使排序码较小的元素逐渐从后部移向前部(从下标较大的单元移向下标较小的单元),就象水底下的气泡一样逐渐向上冒。
因为排序的过程中,各元素不断接近自己的位置,如果一趟比较下来没有进行过交换,就说明序列有序,因此要在排序过程中设置一个标志 flag 判断元素是否进行过交换。从而减少不必要的比较。
选择排序
选择式排序也属于内部排序法,是从欲排序的数据中,按指定的规则选出某一元素,经过和其他元素重整,再依原则交换位置后达到排序的目的。
选择排序思想:
选择排序(select sorting)也是一种简单的排序方法。它的基本思想是:
第一次从 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次,得到一个按排序码从小到大排列的有序序列。
选择排序思路分析图:
从初始状态找到其中最小的数1,让1和第一个元素8交换,接下来从后边的元素找到最小的元素2,然后与第二个元素交换,接下来从第二次找到3,然后和它本身交换,接着依次往下,以此类推,最后形成1 2 3 4 5 6 7 8,这样是从小到大。如果要从大到小的话,就是依次找最大的即可。
选择排序应用实例:
有一群牛,颜值分别是10分,34分,19分,100分,80分请使用选择排序从高到低进行排序
package main
import(
"fmt"
//编写函数 selectsort 完成排序
func Selectsort (arr*[5]int){
//标准的访问方式
(
*
arr)[1]=600
func main(){
//定义一个数组,从大到小
arr:=[5]int{10, 34, 19,10e, 80}
Selectsort (&arr)
fmt.Println(arr)
}
结果就相当于把34改成600
package main
import(
"fmt"
//编写函数 selectsort 完成排序
func Selectsort (arr*[5]int){
//标准的访问方式
(*arr)[1]=600
//1.先完成将第一个最大值和 arr[0]=>先易后难
//1假设 arr[θ]最大值
max:=arr[0]
//2,遍历后面1---[1 en(arr)-1]比较
for i:=0 + 1; i<len(arr);i++{
If max <arr[i]{ //找到真正的最大值
Max=arr[i]
maxIndex = i
}
}
//交换
If maxIndex !=0{
Arr[1],arr[maxIndex]=arr[maxIndex],arr[1]
}
Fmt.Ptintln(“第2次”,*arr)
//定义一个数组,从大到小
arr:=[5]int{10, 34, 19,10e, 80}
Selectsort (&arr)
fmt.Println(arr)
}
//2.遍历后面4---[1en(arr)-1]比较
for i:=3+1;i<len(arr);i++
If max<arr[i]{//找到真正的最大值
Max= arr[i]
//变换
if maxIndex !=3{
arr[3], arr[maxIndex]=arr[maxIndex], arr[3]
fmt. println("第4次")arr)
}
func main(){
}
就按照这种的依次写,第四次过后就变成了从大到小依次排序。会发现每次的代码基本都是相同的,唯一不同的就是 arr 后的值在不断变化
接下来就简化以上代码,直接用一个 for 循环
for j:=e;j<1en(arr)−1;j++{
max:=arr[j]
maxIndex:=j
//2.遍历后面1---[1en(arr)−1]比较
for i:=j+1;i<len(arr);i++{
If max<arr[i]{//找到真正的最大值
max=arr[i]
maxndex=i
}
//交换
if maxIndex !=j{
arr[j], arr[maxIndex]=arr[maxIndex],arr[j]
}
Fmt.Printf(“第%d次 &v\n”,j+1,*arr)
这就是把原来的代码套起来了,结果和原来的结果几乎是一样的
接下来验证代码的正确性,继续增加一个数
arr:=[6]int{10, 34, 19, 100, 80, 789}
fmt. Printin(arr)
selectsort (&arr)
fmt. println("main函数")
fmt. Println(arr)
}
结果也是正确的,也是从大到小排序