【例8.7】 选择排序法 ■编程:对个数排序(按由小到大顺序)。 ■选择法思路:每次选择未排好序的数中最小的放在前面, 个数的排序就是n-1次找最小值的过程。 选择排序过程: n个数的排序就是n-1次找最小值的过程,即: (1)首先通过n-1次比较,从n个数中找出最小数,将 它与第1个数交换一第一趟选择排序一结果:最小数被存入 第1个元素。 (2)再通过n-2次比较,从剩余的n-1个数中找出次小 数,将它与第2个数交换一第二趟选择排序一结果:次小数 存入第2个元素。 (3)重复上述过程,共经过-1趟排序后,排序结束。 恩 6/115
【例8.7】选择排序法 ◼编程:对n个数排序(按由小到大顺序)。 ◼选择法思路:每次选择未排好序的数中最小的放在前面,n 个数的排序就是n-1次找最小值的过程。 6/115 选择排序过程: n 个数的排序就是 n-1 次找最小值的过程,即: (1) 首先通过 n-1 次比较,从 n 个数中找出最小数, 将 它与第1个数交换—第一趟选择排序-结果:最小数被存入 第 1 个元素。 (2) 再通过 n-2 次比较,从剩余的 n-1 个数中找出次小 数,将它与第2个数交换—第二趟选择排序-结果:次小数 存入第 2 个元素。 (3) 重复上述过程,共经过 n-1 趟排序后,排序结束
用选择法对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]是次次小值
用选择法对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[为最小值位置,假设内循环变量为,让a[与 其后的所有元素a逐个比较,j的范围是i+1~~n-1
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 mainO ③ {inta[10],i,j,t,n=10; ④ for(i=0;i<n;i++) ⑤ scanf("%d",&a[i]);//输入原始数据 ⑥ for(i=0;i<n-1;+)/排序-外循环 ⑦ {for(j=i+1;j=n-1;jt+)/排序-内循环 ⑧ 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; 4 田老。加上数捏的百业的字早2
例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; ⑭ } 思考:加上数据的原来的序号?
选择法排序(从小到大)第一轮查找最小值的过程-举例 =0 10 9 8 7 654321-初始数据 9 10 8 7 6 5 4 3 2 1 8 10 9 7 6 4 3 2 1 7 10 9 8 6 5 4 3 2 1 6 10 9 8 5 4 3 2 1 110 98765432
• 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 选择法排序(从小到大)第一轮查找最小值的过程-举例