ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

算法 class 004(选择,冒泡,插入)

算法 class 004(选择,冒泡,插入) 选择排序刚进入 j 循环的样子j 跳出循环后b 指向最小值的坐标然后交换 i 和 b 位置的 值随后 i , b i , i j1; 开始新一轮的排序void SelectAQort(int* arr,int size)//选择排序 { for (int i 0; i size-1; i) { //i 的位置就是最小值应该放入的位置 int b i;//存储最小值下标一开始默认是 i for (int j i1; j size;j) { if (arr[j] arr[b])//随着j的变化 { //如果j下标的值比b下标还小的值 b j;//那么就将他赋值给 b } } //出了 j的循环b指向的就是最小值的坐标将 b 与 i 交换 if (i b)//处理i就是最小值的情况 continue; Swap(arr, i, b);//交换函数 // 9,8,2,1,7,9,4,8,7,2,3,4 } }冒泡排序以上图为例第一次进入 j 循环每次如果j位置的数大于j后面一位的数那么就交换这两个位置的数j 大于 j1位置的数8 和 3交换j 1j 大于 j1位置的数8 和 7交换j 2j 大于 j1位置的数8 和 4交换j 3j 不大于 j1位置的数不交换 单纯的 j 4j 大于 j1位置的数9 和 5交换j 5j 大于 j1位置的数9 和 7交换j 6j 大于 j1位置的数9 和 2交换j 7j 大于 j1位置的数9 和 8交换j 8j 大于 j1位置的数9 和 4交换j 9j 不大于 j 1位置的数不交换j 10;j 大于 j1位置的数9 和 5交换j 11;j 大于 j1位置的数9 和 7交换j 12j 不大于 j1位置的数不交换j 13由与 j i 所以加完之后 j 循环第一次结束结束后 i 的位置就是最大值了然后 i-- ,j 又重新来到 0 位置新的循环将是 j 遍历至 i -1的位置i - 1的位置会得出新的最大值i 最终的有效位 是 1进入 i 是 1的循环j 0 j 与 j 1做比较大于就交换然后跳出 j 的循环j会等于 i 跳出跳出 i 的循环i -- 等于0跳出函数结束如果不大于直接跳出 j 的循环然后跳出 i 的循环与上面一样只是少了一次交换。插入排序i 赋值 为 1 默认 1下标前面的数是有序的j i 用 j 来实现插入如果 j 小于 j -1就交换如果不小于我们使用 j 0提前结束 j 循环。以上图为例j 与 j-1比较j 不小于 j -1 ,j 0j循环第一次结束i , j ij j - 1,交换然后 j--;j 0继续判断j 不小于 j - 1j 0; j循环第二次结束i , j i;我们的 i 前面的数都是有序的所以如果j 第一次判断就不小于 j - 1,我们就可以使 j 0提前结束循环。小于我们就一直往前找如果 i 指向的数是当前最小值在 j 1时j 与 j - 1交换完后 ,j-- 0,会自己跳出循环如果在往前找的过程中有一次没有交换 就用 j 0提前结束
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进