本帖最后由 倾心莫若初见 于 2016-12-15 17:42 编辑
选择排序的根本原理是默认第一个数为最值,第一个数的下标记为最值下标,从当前数字开始,用最值数字与其他各数字比较,把符合条件的数字下标记为最值下标,再继续使用新的最值数字与下一个数比较,直到一次循环结束,被记录下的位置一定是所有数中的最值,然后把这个数字和当前数字交换。例子如下: 假设有一个数列 2,1,3,6,8,7,4,9,5,0 共有10个数字 如果我们要从小到大排序,可按以下步骤: 1) 默认第一个数字2为最小值,定义min变量记录最值下标0 2) 把 最小值2 和 1 比较,2 比 1 大,所以更新最小值下标为1 3) 再把最小值 1和 3 比较,1比 3 小,最小值下标不需要更新,递进到下一个位置 4) 最小值1 和 6 比较,1 比 6 小,最小值下标不需要更新,递进到下一个位置 5) 最小值1 和 8 比较,1 比 8 小,最小值下标不需要更新,递进到下一个位置 6) 最小值1 和 7 比较,1 比 7 小,最小值下标不需要更新,递进到下一个位置 7) 最小值1 和 4 比较,1 比 4 小,最小值下标不需要更新,递进到下一个位置 8) 最小值1 和 9 比较,1 比 9 小,最小值下标不需要更新,递进到下一个位置 9) 最小值1 和 5 比较,1 比 5 小,最小值下标不需要更新,递进到下一个位置 10)最小值1 和 0 比较,1 比 0 大,更新最小值下标为数字0的下标9 11)一次循环结束,找到最小值为0,最小值下标为9,把最小值和当前值(第一个数字2)交换,结果如下:
0,1,3,6,8,7,4,9,5,2 12)这样就排好一个数字,接下来循环递进,把1作为默认最小值,1的下标作为最小值下标,继续与1后面的所有数字遍历比较 每次把以上的步骤执行一遍都会排好一个数,那10个数最多执行9遍就可以了,所以外循环的次数是总次数减一,而内循 环的值是从外循环的下一个位置开始,直到最后一个下标结束,代码如下: int main() { int arr[10] = {2,1,3,6,8,7,4,9,5,0 }; //定义10个数的数组 int min = 0; //定义变量 min 记录下最小值的下标 for (int i = 0; i < 10 -1; ++i) //每次排好一个数,10个数最多排9次 { min= i; //默认当前数为最小值,记录下最小值下标 for (int j = i + 1; j <10; ++j) //内循环从i的下一个数开始,到最后结束 { if (arr[min] >arr[j]) //如果后面某个数比当前最小值还小 { min= j; //把后面的数作为最小值,记录下它的下标 } } //经过上面这个循环,就找到了最小值的下标 min if (min != i) //如果 min = i,代表i位置的数本身就是最小值,不需要交换 { //交换最小值到当前位置 int temp = arr; arr= arr[min]; arr[min]= temp; } } //输出排好后的数组 for (int i = 0; i < 10;++i) { printf("%d ", arr); } return 0; } |