用选择法对10个数按从小到大升序排序--算法(假设n=10):1、首先找出10个数中的最小数,并存入a[0]中。将a[0]与a[1]、a[2]、a[3]、a[9]进行比实现方法:较,若a[0]大于任何一个--交换最后a[是最小值2、找出10个数中的次小数,并存入a[1]中。实现方法:将a[]]与a[2]、a[3]、a[9]进行比较,若a[i]大于任何一个--交换1———-最后a[1]是次小值。3、找出10个数中的次次小数,并存入a[2]中。将a[2]与a[3]、.a[9]进行比较,若a[2]大实现方法:于任何一个一交换最后a[2]是次次小值
用选择法对10个数按从小到大升序排序-算法(假设n=10): 1、首先找出10个数中的最小数,并存入a[0]中。 实现方法:将a[0]与a[1] 、a[2]、a[3]、.a[9]进行比 较,若a[0]大于任何一个-交换-最后a[0]是最小值。 2、找出10个数中的次小数,并存入a[1]中。 实现方法:将a[1]与 a[2]、a[3]、.a[9]进行比较,若 a[1]大于任何一个-交换-最后a[1]是次小值。 3、找出10个数中的次次小数,并存入a[2]中。 实现方法:将a[2]与a[3]、.a[9]进行比较,若a[2]大 于任何一个-交换-最后a[2]是次次小值。
n个数的选择法排序是个两重循环外循环控制求最小值的次数---(n-1)次求最小值用n-1次外循环实现。---假设外循环变量为i,则i的循环范围是0~n-2。内循环完成求一个最小值的过程:假设当前元素a[为最小值位置、假设内循环变量为j,让a与其后的所有元素ai逐个比较,j的范围是+1~~n-1。例8.7一n个数从小到大排序(选择法排序)①#include<stdio.h)②intmainO?[ int a[10],i, j, t,n=10;?for(i=0;i<n;i++)?scanf("%d",&a[i]);/输入原始数据?//排序-一外循环for(i=0;i<n-l;i++)?【for(j=i+1:j<-n-1;j++)//排序-一内循环##日日日日日(if (a[i]>a[j])(t=a[i]:a[i]=a[]:a[]=t:]//交换数据1for(i=;i<n;i++) printf("%d ",a[ij):printf("\n");return 0;思考:加上数据的原来的序号?
n个数的选择法排序是个两重循环 ➢ 外循环控制求最小值的次数-(n-1)次求最小值用n-1次外循环实现。 -假设外循环变量为 i,则 i 的循环范围是0~n-2。 ➢ 内循环完成求一个最小值的过程:假设当前元素a[i]为最小值位置、假设内循环变量为 j, 让a[i]与其后的所有元素a[j]逐个比较,j的范围是i+1~~n-1。 例8.7-n个数从小到大排序(选择法排序) ① #include <stdio.h> ② int main() ③ { int a[10],i,j,t,n=10; ④ for (i=0;i<n;i++) ⑤ scanf("%d",&a[i]); // 输入原始数据 ⑥ for (i=0;i<n-1;i++) // 排序-外循环 ⑦ { for (j=i+1;j<=n-1;j++) //排序-内循环 ⑧ { if (a[i]>a[j]) ⑨ { t=a[i]; a[i]=a[j]; a[j]=t; }//交换数据 ⑩ } ⑪ } ⑫ for(i=0;i<n;i++) printf("%d ",a[i]); ⑬ printf("\n"); ⑭ return 0; ⑮ } 思考:加上数据的原来的序号?
选择法排序(从小到大)第一轮查找最小值的过程-举例i=08653291071-----初始数据A810.310.e2G.10329653298106154J8921076534
• 10 9 8 7 6 5 4 3 2 1-初始数据 • 9 10 8 7 6 5 4 3 2 1 • 8 10 9 7 6 5 4 3 2 1 • 7 10 9 8 6 5 4 3 2 1 • 6 10 9 8 7 5 4 3 2 1 . • 1 10 9 8 7 6 5 4 3 2 j i=0 j j j j 选择法排序(从小到大)第一轮查找最小值的过程-举例
,选择排序有什么缺陷?-多余的交换如何修改?----P1551)定义一个标记变量k---标记本轮比较中最小值a[k]的位置--假设初始元素ai最小,将其下标i作为标记变量k的初始值。2)让后面的所有元素与k所标记位置的最小值a[k]做比较,如果后面的某个元素比a[k]还小,将该元素的下标赋给标记变量k。3)当内循环结束之后,如果标记变量k不再指向初始元素a[i],说明最小值不在初始位置ai---让初始元素a与标记变量k所标记位置的元素a[k]做一次交换,否则不需交换
• 选择排序有什么缺陷? -多余的交换 • 如何修改?- P155 1)定义一个标记变量 k -标记本轮比较中最小值a[k]的位置 -假设初始元素a[i]最小,将其下标i作为标记变量 k 的初始值。 2)让后面的所有元素与 k 所标记位置的最小值a[k]做比较, 如果后面的某个元素比a[k]还小,将该元素的下标赋给标记 变量k。 3)当内循环结束之后,如果标记变量 k 不再指向初始元素 a[i],说明最小值不在初始位置a[i]-让初始元素a[i]与标记变 量 k 所标记位置的元素a[k]做一次交换,否则不需交换
a|k|与a[i+l]---a[n-]比较:k改进的选择排序图示效果从小到大初始:【13i=03876271659749k+i=1一:9713[27657649381二趟:i=213[6597764938]27V三趟i=313764927[973865]四趟97133849[7627651五趟:131=52749659776]38六趟:i=6132765384976[97]
初始:[ 49 38 65 97 76 13 27 ] j i = 0 13 49 i = 1 一趟: 13 [ 38 27 65 97 76 49 27 ] 38 二趟: 13 27 [65 97 76 49 38 ] 三趟: 13 27 38 [97 76 49 65 ] 四趟: 13 27 38 49 [76 97 65 ] 五趟: 13 27 38 49 65 [97 76 ] 六趟: 13 27 38 49 65 76 [97 ] k k k k j j j j j j j j j j k 改 进 的 选 择 排 序 图 示 效 果 — 从 小 到 大 i = 3 i = 2 i = 6 i = 5 i = 4 a[k]与 a[i+1]-a[n-1]比较: