选择排序:
刚进入 j 循环的样子
j 跳出循环后,b 指向最小值的坐标
然后交换 i 和 b 位置的 值
随后 i ++, b = i , i = j+1; 开始新一轮的排序,
void SelectAQort(int* arr,int size)//选择排序 {for (int i = 0; i < size-1; i++){ //i 的位置就是最小值应该放入的位置int b = i;//存储最小值下标,一开始默认是 ifor (int j = i+1; 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+1位置的数,8 和 3交换,j++ = 1;
j 大于 j+1位置的数,8 和 7交换,j++ = 2;
j 大于 j+1位置的数,8 和 4交换,j++ = 3;
j 不大于 j+1位置的数,不交换 单纯的 j++ = 4;
j 大于 j+1位置的数,9 和 5交换,j++ = 5;
j 大于 j+1位置的数,9 和 7交换,j++ = 6;
j 大于 j+1位置的数,9 和 2交换,j++ = 7;
j 大于 j+1位置的数,9 和 8交换,j++ = 8;
j 大于 j+1位置的数,9 和 4交换,j++ = 9;
j 不大于 j +1位置的数,不交换,j++ = 10;
j 大于 j+1位置的数,9 和 5交换,j++ = 11;
j 大于 j+1位置的数,9 和 7交换,j++ = 12;
j 不大于 j+1位置的数,不交换,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 = 0,j循环第一次结束
i++ , j = i
j < j - 1,交换,然后 j--;
j > 0,继续判断,j 不小于 j - 1,j = 0; j循环第二次结束,
i++ , j = i;
我们的 i 前面的数都是有序的,所以,如果j 第一次判断就不小于 j - 1,,我们就可以使 j = 0,提前结束循环。
小于我们就一直往前找,如果 i 指向的数是当前最小值,在 j = 1时,j 与 j - 1,交换完后 ,
j-- = 0,会自己跳出循环,
如果在往前找的过程中有一次没有交换, 就用 j = 0;提前结束