持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第30天,点击查看活动详情
一、排序
1.1 排序介绍
排序是将一组数据, 依指定的顺序进行排列的过程。 排序的分类:
- 1、内部排序:
指将需要处理的所有数据都加载到内部存储器中进行排序。 包括(交换式排序法、选择式排序法和插入式排序法);
- 2、外部排序法:
数据量过大,无法全部加载到内存中,需要借助外部存储进行 排序。包括(合并排序法和直接合并排序法)。
1.2 交换式排序
交换式排序属于内部排序法,是运用数据值比较后,依判断规则对数据位置进行交换,以达到排序的目的。
交换式排序法可分为两种:
- 1)冒泡排序法(Bubble sort)
- 2)快速排序法(Quick sort)
1.2.1 冒泡排序
冒泡排序( Bubble Sorting) 的基本思想是:通过对待排序序列从后向前(从下标较大的元素开始),依次比较相.邻元素的排序码,若发现逆序则交换,使排序码较小的元素逐渐从后部移向前部(从下标较大的单元移向下标较小的单元),就像水底下的气泡一样逐渐向上冒。
因为排序的过程中,各元素不断接近自己的位置,如果一趟比较下来没有进行过交换,就说明序列有序,因此要在排序过程中设置一个标志flag判断元素是否进行过交换。从而减少不必要的比较。
案例
以下具体的案例来说明插入法。我们将五个无序:25, 66, 75, 54, 18使用冒泡排序法将其排成一个从小到大的有序数列。
首先有一个数组
- Arr = [25,66,75,54,18]
第一轮比较(外层)
- 1.1 在原始基础上,25和66进行比较; 25<66,所以第一次没有改变 ===》 [25,
66, 75, 54, 18] - 1.2 在1.1基础上,66和75进行比较; 66<75,所以第二次没有改变 ===》 [25, 66,
75, 54,18] - 1.3 在1.2基础上,75和54进行比较; 75>54,所以第三次改变 ======》 [25, 66, 54,
75, 18] - 1.4 在1.3基础上,75和18进行比较; 75>18,所以第四次改变 ======》 [25, 66, 54, 18, 75]
在第一轮比较中,进行了4次比较得到===>[25, 66, 54, 18, 75],确定最大数
第二轮比较(外层),在第一轮基础上
- 2.1 在1.4基础上,25和66进行比较; 25<66,所以第一次没有改变 ===》 [25,
66, 54,18, 75] - 2.2 在2.1基础上,66和54进行比较; 66>54,所以第二次改变 ======》 [25, 54,
66, 18,75] - 2.3 在2.2基础上,66和18进行比较; 66>18,所以第三次改变 ======》 [25, 54, 18, 66, 75]
在第二轮比较中,进行了3次比较得到===>[25, 54, 18, 66, 75]
第三轮比较(外层),在第二轮基础上
- 3.1 在2.3基础上,25和54进行比较; 25<54,所以第一次没有改变 ===》 [25,
54, 18,66, 75] - 3.2 在2.1基础上,54和18进行比较; 54>18,所以第二次改变 ======》 [25, 18, 54, 66, 75]
在第三轮比较中,进行了2次比较得到===>[25, 18, 54, 66, 75]
第四轮比较(外层),在第三轮基础上
- 4.1 在3.2基础上,25和18进行比较; 25>18,所以第一次改变 ===》 [18, 25, 54, 66, 75]
在第四轮比较中,进行了1次比较得到===>[18, 25, 54, 66, 75]
冒泡排序规则-总结:
- 一共会经过
数组长度-1轮比较,每一轮将会确定一个数的位置 - 每一轮的比较次数逐渐减少
- 前面一个数比后面一个数大时,进行交换
1.2.2 冒泡排序代码实现 -- 方式一(内部for循环不同)
package main
import "fmt"
// 冒泡排序函数
func bubbleSort(arr *[5]int) {
// 排序前
// soft befor arr = [25 66 75 54 18]
fmt.Println("soft befor arr = ", *arr)
// 定义中间临时变量
temp := 0
// 外层轮
for i := len(arr) - 1; i > 0; i-- {
// 内层次数
for j := 0; j < i; j++ {
// 比较大小
if (*arr)[j] > (*arr)[j+1] {
temp = (*arr)[j]
(*arr)[j] = (*arr)[j+1]
(*arr)[j+1] = temp
}
}
}
fmt.Println("Sorted arr = ", *arr)
}
func main() {
// 声明数组
arr := [5]int{25, 66, 75, 54, 18}
// 将数组传递给函数
bubbleSort(&arr)
// soft befor arr = [25 66 75 54 18]
// Sorted arr = [18 25 54 66 75]
}
1.2.3 冒泡排序代码实现 -- 方式一(内部for循环条件不同)
package main
import "fmt"
// 冒泡排序函数
func bubbleSort(arr *[5]int) {
// 排序前
// soft befor arr = &[25 66 75 54 18]
fmt.Println("soft befor arr = ", *arr)
// 定义中间临时变量
temp := 0
// 外层轮
for i := 0; i < len(*arr)-1; i++ {
// 内层次数
for j := 0; j < len(*arr)-1-i; j++ {
// 比较大小
if (*arr)[j] > (*arr)[j+1] {
temp = (*arr)[j]
(*arr)[j] = (*arr)[j+1]
(*arr)[j+1] = temp
}
}
}
fmt.Println("Sorted arr = ", *arr)
}
func main() {
// 声明数组
arr := [5]int{25, 66, 75, 54, 18}
// 将数组传递给函数
bubbleSort(&arr)
// soft befor arr = [25 66 75 54 18]
// Sorted arr = [18 25 54 66 75]
}