依次比较相邻的两个元素,将比较小的数放在前面,比较大的数放在后面,直到所有元素排列完。
对一个数组的个整型数据进行趟排序,每趟排序都尝试将较大值放到数组右侧。
每趟排序比较两个相邻的数据,由于个数据有个间隔,所以每趟需要比较次。
代码如下:
Java
C/C++
上述代码存在优化空间:
在第一趟排序结束后,数组最右端已是当前的最大值。剩余元素均小于,后续排序无需再与进行比较。
在第二趟排序结束后,数组最右侧是,剩余元素均小于,后续排序无需再对进行比较。
即对于内层循环:
对于外层循环,在执行第趟排序时,内层循环只比较了第个元素和第个元素。
此时已经排列完成,不需要再执行下一趟排序。
即对于外层循环:
在第2步中,如果值为,则表明发生交换,继续下一步。
如果值为,则表明没有发生交换,即已经排序完成,结束即可。
C/C++
Java
需要注意的是,内层循环的结束条件与无关。
分别从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。选择排序是不稳定的排序算法,即对于值相同的数据元素,彼此的前后顺序可能会发生改变。
与冒泡排序不同:
即重复这两个步骤:
Java
C/C++
需要注意:
C/C++
Java
要点如下:
交换两个变量的值,除了可以使用第三个变量tmp,也可以使用加减法的方式处理,仅适用于数字类型。
三种排序方法每趟都只能确保一个数据加入有序数列后仍有序,外层循环执行的趟数都为,即元素个数。但由于计数器开始位置不同,可能为,也可能为,或者其它计数方式,不需要死记硬背,只需要保证能执行趟即可。
对于内层循环,还是由于三种排序方法每趟都只能确保一个数据加入有序数列后仍有序。有序序列每趟排序后长度都在增加,我们不需要对有序序列的元素再取出排序。我们只需要保证能遍历到无序序列中的每一个元素即可。
本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕,E-mail:xinmeigg88@163.com
本文链接:http://www.ksxb.net/tnews/11661.html