前两篇博客介绍了排序算法中的交换排序中的冒泡排序和快速排序。虽然两种排序都属于交换排序,但是这两个排序的时间复杂度却天壤之别。接下来的两篇文章将介绍选择排序类中的两个排序算法:简单选择排序和堆排序。由于堆排序相较于前面介绍的算法要复杂不少,所以本篇博客先用简单排序算法作为开胃小菜,让大家先理解选择算法的思想,然后再介绍堆排序算法。
在上篇博客中,我提到过,冒泡排序算法是我大一C语言课程中接触的第一个排序算法,而今天要介绍的选择排序算法我记得是讲完冒泡排序不久在课堂上学到的第二个排序算法。因为这两个算法可以灵活地运用流程控制语句和循环语句,对大一新生熟悉程序设计非常有用,也可以为大二即将学习的数据结构和算法进行预热。算法上逻辑并不复杂,而且实现起来只需要很简单的几行代码。
之前介绍的交换排序算法如果用一个字来归纳它的精髓就是一个"换"字,通过交换把无序的数组变成有序;选择排序如果用一个字来形容的话,我相信大家已经猜到了,那就是“选”。对于简单排序来说,排序的过程就是选择的过程,简单一句话来形容就是通过遍历数组,选择数组最小的数字将该数字移到数组的首位,然后继续遍历其他的,将剩余数组最小的元素放到第二位,以此类推,这样就得到了一个有序的数组。
简单选择排序算法,顾名思义,它很简单,借用本山大叔的一句台词:你别整三岁的,有能耐你整四岁的。这也许就是有的人看完我上一篇冒泡排序算法之后的想法,这两个算法用西游记里面的两个人物来形容就是一个是奔波儿灞,一个是霸波尔奔,半斤八两,甚至效率上也是一样的,O(n2)。虽然这两个算法都不难,但是我们要在战略上藐视对手,在战术上要重视对手。真正的把知识掌握了之后,他就会潜移默化的融入你的思想,你的身体,让你变得更强,在未来某时某刻会发挥奇效。又扯远了,收回来,接下来开始介绍简单选择排序的算法思想和程序实现。
所有的算法都是实现同一个目的,就是在一系列操作时候将无序数组变成,一个数组前面的元素都不大于后面元素的数组。简单排序算法就是非常严格的遵循了这个算法,既然你要前面的元素都不大于后面的,那我就找到最小的放在第一个,然后继续找最小的放在第一个。这个过程只用两步就能实现,第一步就是选出最小的把这个最小值放到首位,第二步就是从第二位开始进行第一步操作。接下来是详细的描述:
1、遍历整个数组,假设第一个元素为整个元素最小值,用这个元素跟数组其他元素进行比较,如果遇到了更小的元素,将更小的元素设为最小的元素,并将两个元素的位置进行交换,这样在遍历数组之后最小的元素就被移动到了第一位。
2、把剩余的数组重复第一步操作,直到最后只剩下一个元素那么前面的元素一定都是有序的而且都是不大于最后一个的,这样就得到一个有序的数组。
万事俱备,只差代码:
代码比较简单,就不详细解释了,但是两个for循环需要稍微强调一下,第一个是遍历数组,并把第一个元素设为最小值,在内层循环中,用这个预先定义的最小值与数组中的元素进行比较,如果出现了更小的元素将他放到第一个元素。当遍历完整个元素之后小的元素就被选出并放在了每次子数组的第一位,最后就变成了一个有序的数组。快速选择排序就讲到这里了,感谢阅读,希望我的博客能给大家带来收获。