|
本帖最后由 易团雪 于 2024-5-14 20:05 编辑
一.冒泡算法
比较相邻元素,符合比较条件,交换位置较大的往后排,反复比较交换,直到所有数据都符合排序条件,得出排序效果,结束排序
算法说明
1.比较相邻元素: 从数组的第一个元素开始,比较相邻的两个元素。
2.交换元素位置: 如果顺序不对(比如,当前元素大于下一个元素),就交换这两个元素的位置。
3.一轮过后的效果: 一轮过后,最大(或最小)的元素就会“冒泡”到数组的末尾。
4.重复进行多轮: 重复以上步骤,每轮都会使数组变得有序,并且确定一个元素的最终位置,直到整个数组有序
- 函数 空类型 数组排序_冒泡算法(动态数组<整型> &需排序数组)
- {
- 逻辑型 是否交换
- 整型 数组大小 = 需排序数组.取大小()
- 变量循环 (整型 i = 0; i < 数组大小 - 1; i++)
- {
- 是否交换 = 假
- 变量循环 (整型 j = 0; j < 数组大小 - i - 1; j++)
- {
- 如果 (需排序数组[j] > 需排序数组[j + 1])
- {
- // 交换元素
- 交换变量(需排序数组[j], 需排序数组[j + 1])
- 是否交换 = 真
- }
- }
- // 如果没有发生交换,数组已经有序,提前结束
- 如果 (!是否交换)
- {
- 跳出
- }
- }
- }
复制代码
二.插入排序
插入排序得比喻成斗地主,手里摸牌之后都是按照从小到大的顺序。每摸到一张牌就把他们插入到合适的位置,使得他们比后面小,比前面大或者相等
算法说明
1.初始状态:将整个数组看作两个部分,已排序部分和未排序部分。初始时,已排序部分只包含第一个元素,未排序部分包含除第一个元素外的所有元素。
2.逐个插入:从未排序部分取出一个元素,将其插入到已排序部分的正确位置,使得插入后的序列仍然有序。
3.重复过程:重复上述步骤,每次从未排序部分取出一个元素并插入到已排序部分,直到整个数组有序。
- 函数 空类型 数组排序_插入排序(动态数组<整型> &需排序数组)
- {
- 整型 temp
- 变量循环 (整型 i = 1; i < 需排序数组.取大小(); i++)
- {
- 变量循环 (整型 j = i - 1; j >= 0; j--)
- {
- 如果 (需排序数组[j + 1] < 需排序数组[j])
- {
- temp = 需排序数组[j + 1]
- 需排序数组[j + 1] = 需排序数组[j]
- 需排序数组[j] = temp
- }
- 否则 (需排序数组[j + 1] >= 需排序数组[j])
- {
- 跳出
- }
- }
- }
- }
复制代码 三.归并排序
将长的数组分解为短的数组,一直分到最后,单个单个数组比较,我们就认为,只有一个元素的数组是有序的。然后再逐个的合并
算法说明
1.拆分(分治): 将数组拆分为两半,然后对每一半递归地应用归并排序,直到每个子数组都只包含一个元素。
2.合并: 将已排序的两个子数组合并成一个有序数组。合并过程中,比较两个子数组的元素,将较小的元素放入新数组,并移动相应的指针。
3.递归: 递归地对子数组进行拆分和合并,直到整个数组有序。
- 函数 空类型 归并排序_合并(动态数组<整型> &arr, 整型 low, 整型 mid, 整型 high)
- {
- 整型 n1 = mid - low + 1
- 整型 n2 = high - mid
- // 创建临时数组
- 动态数组<整型> left(n1)
- 动态数组<整型> right(n2)
- // 将数据复制到临时数组 left[] 和 right[]
- 变量循环 (整型 i = 0; i < n1; i++)
- {
- left[i] = arr[low + i]
- }
- 变量循环 (整型 j = 0; j < n2; j++)
- {
- right[j] = arr[mid + 1 + j]
- }
- // 合并临时数组 back 到 arr[low..high]
- 整型 i = 0 // 初始左半部分的索引
- 整型 j = 0 // 初始右半部分的索引
- 整型 k = low // 初始合并数组的索引
- 循环 (i < n1 && j < n2)
- {
- 如果 (left[i] <= right[j])
- {
- arr[k] = left[i]
- i++
- }
- 否则
- {
- arr[k] = right[j]
- j++
- }
- k++
- }
- // 复制剩余的元素(如果有的话)
- 循环 (i < n1)
- {
- arr[k] = left[i]
- i++
- k++
- }
- 循环 (j < n2)
- {
- arr[k] = right[j]
- j++
- k++
- }
- }
- 函数 空类型 数组排序_递归(动态数组<整型> &arr, 整型 low, 整型 high)
- {
- 如果 (low < high)
- {
- // 计算中间位置
- 整型 mid = low + (high - low) / 2
- // 递归排序左右两侧
- 数组排序_递归(arr, low, mid)
- 数组排序_递归(arr, mid + 1, high)
- // 合并两个已排序的部分
- 归并排序_合并(arr, low, mid, high)
- }
- }
复制代码 以上来源于网络,我只是翻译 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|