1、前言
算法,在计算机中的地位,就相当于人类大脑的决策中枢系统,哪怕最简单的算法,其精妙的思维方式,都可以让人开启一扇新的视窗。
算法,它不仅仅只是狭义的用来解决计算机科学领域的问题,更是一种“思维方式”。算法思维,是一种深度思考和创造的过程。
算法,只有真正理解了,而不只是所谓的知道,并将应用到生活、工作、学习等各个方面,它将一定使人受益终生。
2、原理推导
选择排序,就是选择一个固定的元素与之后的元素依次比较,把小的元素往前调或者把大的元素往后调,实现元素的顺序排列。
给定一组 {9,7,1,5,8,6} 的原始无序数组,按照从小到大升序排列。
#step1
第一个数字【9】和第二、三、四、五、六个数字依次比较,得出最小数字1,然后数字 【1】 和 【9】 位置互换,完成第一轮排序。
#step2
第二个数字【7】和第三、四、五、六个数字依次比较,得出最小数字5,然后 【5】 和 【7】 位置互换,完成第二轮排序。
#step3
第三个数字【9】和第四、五、六个数字依次比较,得出最小数字6,然后 【6】 和 【9】 位置互换,完成第三轮排序。
#step4
第四个数字【7】和第五、六个数字依次比较,得出最小数字7,数字 【7】 和 【8】 位置不需要互换,完成第四轮排序。
#step5
第五个数字【8】和第六个数字依次比较,得出最小数字8,数字【8】 和 【9】 位置不需要互换,完成第五轮排序。
至此,选择排序已经完成结果为:{1,5,6,7,8,9} ,我们可以看到step4顺序已经排好了,但程序并不知道,所以还会接着继续比较直到最后。
3、代码示例
# 第一种实现,每次比对只要符合条件,马上交换两个元素位置
public static void chooseSortOne(int array[]){
//外层循环控制总次数
for (int i=0;i<array.length-1;i++){
//内层循环控制单个元素比较次数
for (int j=i+1;j<array.length;j++){
//选择每次从索引【i】开始,分别与后面的其他元素比较,不是相邻的两个数相比较
if(array[i] > array[j]){
//每次比较满足条件,进行位置交换
swapPosition(array, j, i);
}
}
}
}
# 第二种实现,每次比对符合条件,不进行位置交换,只记录需要交换的索引,到一轮比较结束再交换位置
public static void chooseSortTwo(int array[]){
//交换索引
int index = 0;
//外层循环控制总次数
for (int i=0;i<array.length-1;i++){
//每次从【i】开始,index根据比较结果,更新索引位置
index = i;
//选择每次从索引【index】开始,分别与后面的其他元素比较,不是相邻的两个数相比较
for (int j=i+1;j<array.length;j++){
if(array[index] > array[j]){
//满足条件时不进行位置交换,只记录索引,下次比较以新的索引为起始位置
index = j;
}
}
//一轮循环结束,再将两个数的索引位置互换,节省交换次数,提高排序效率
swapPosition(array, index, i);
}
}
# 元素交换方法
public static void swapPosition(int array[], int indexA, int indexB){
int temp = array[indexA];
array[indexA] = array[indexB];
array[indexB] = temp;
}
4、禅定时刻
选择排序的精妙之处不在于选择一个元素依次比较,而在于对他的优化处理,比较而不交换,一个小的调整,在数据量级不大的时候,难以体现它的优势,一旦数据量级超过一定的界限,运算效率的速度就相差巨大。
一个产品创造过程中,我们遇到常规的问题,用常规的解决方案可以应付,如果能养成习惯多一份思考,在此基础上持续改进,优化实现方法,日积月累这就形成了个人和企业的护城河,增强个人和企业在社会中的竞争力。
作者简介
思维的持续,一个真的有思想,不穿格子衬衫的程序员。