黑马程序员技术交流社区

标题: 【算法】选择排序 [打印本页]

作者: 倾心莫若初见    时间: 2016-12-15 15:38
标题: 【算法】选择排序
本帖最后由 倾心莫若初见 于 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;
}





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2