冒泡排序与选择排序

问题:有一个由十位整数组成的数组,进行排序,并在键盘上输入十位整数,使用多函数。

解析:可以想到冒泡排序与选择排序;

冒泡排序

输入十个整数,比如23  12   21  45  56  65  76  90  54  10;在其中选出最值。

第一次:23与12比较,23>12进行交换则为12,23。23再与21进行比较,23>21进行交换,则为21,23。23与45进行比较23<45则不进行交换。45与56进行比较,45<56,也不进行交换。56与65进行比较,56<65也不进行交换。65与76,76与90也是同样不进行交换。90与54进行比较,90>54进行交换,54,90。90与10进行比较,90>10,90与10进行交换,10,90。第一次数组为:12,21,23,45,56,65,76,54,10,90。找出十个数中最大值为90。(交换时t做中间变量)

第二次:按照第一种方法一样只是不用进行最后一项的比较。最大值为76.

第三次:按照以上方法进行比较,不用进行最后两相比较。最大值为65

。。。

即:第一次循环了九次,第二次循环了八次,第三次循环了七次。。。第九次循环了一次即第一次外循环为:for(i=0;i<9;i++);每次循环都从0开始,每次循环都可以在其中的数值中找到最大值,最大值排在所有数值中最后一位,所以最后一个值就不看。所以第二次循环写出代码。

j=0;

for(j=0;j<sz-i-1;j++)

 {

        if(arr[j]>arr[j+1])

        {

                t=arr[j];

                arr[j]=arr[j+1];

                arr[j+1]=t;

        }

}

代码:

其中 第一步 j=0,可以省略,直接用循环进行初始化。

总结:冒泡排序 它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成 

选择排序:

输入十个整数,比如23  12   21  45  56  65  76  90  54  10;在其中选出最值。

分析:先设定一个变量flag为0,循环与冒泡排序循环相同(都是两两比较)都循环九次。且每一次循环将数组中第i个数字赋值给变量flag,再进入内循环,内循环也循环九次(也是两两比较)。

第一次:先设flag为i的第一次循环的数字,再进入内循环,内循环是从外循环的基础上+1,即数组中的第一个数和第二个数进行比较,如果第一个数大于第二个数字则就将内循环的 j赋值给flag。(注意:交换的是数组对应的下标而不是数组中的数字)如果第一个数小于第二个数,就进行 j++。23与12进行比较,23>12,则flag=1,j++,则 j=2.  接下来就是 12与34进行比较发现12小则flag就不进行赋值。在接下来 j=3, 12与43进行比较同样12较小。j=4,12与57比较,12较小flag也不赋值。。。一直到12与65比较发现12一直都是最小,则flag=1,与i=0所对应的数字进行交换找到数组中的最小值。(t为中间变量)

第二次:flag赋值为i=1, 第二次循环的数字,再进入内循环,内循环是从外循环的基础上+1,即j=2数组中的第er\\二个数和第三个数进行比较,再进行如第一次循环的操作。

。。。

代码:

总结:选择排序( Selection sort)是一种简单直观的排序算法。 它的工作原理是每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。

小小拓展:求出最大值与最小值的差值。

代码:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值