如果说循环加数组是绝配的话,那么排序算法则是这二者结合之后的完美体现了。在学习J2SE的时候,在数组这一章提前接触到了“排序算法”,感觉好玩,就总结一下。
下面仅仅针对“选择排序”这一个部分进行总结。
基本介绍:
1、明确在内存中,数组是在堆中的,对于静态数组来说,堆中存放的是对数组的引用(指针),我们排序所做的工作,不是让内存中堆中数据进行变动,而是改变堆中引用的排列组合。
2、该算法一般嵌套在两层循环中,第一层循环从起始元素开始直到倒数第二个元素,
第二层循环从第一层变量的下一个值开始,直至数组结束。
代码展示:
<pre name="code" class="java">public static void selectSort(int[]a) { int minIndex=0; int temp=0; if((a==null)||(a.length==0)) return; for(int i=0;i<a.length-1;i++) { //无序区的最小数据数组下标 minIndex=i; for(intj=i+1;j<a.length;j++) { //在无序区中找到最小数据并保存其数组下标 if(a[j]<a[minIndex]) { minIndex=j; } } if(minIndex!=i) { //如果不是无序区的最小值位置不是默认的第一个数据,则交换之。 temp=a[i]; a[i]=a[minIndex]; a[minIndex]=temp; } } }
算法优化:
如图所示,当第一层循环的下表为2的时候,即a[2]=4,此时a[5]和a[7]均小于a[2],如果仍然使用如上算法,则4先和3交换,4再和2交换,最后3再和2交换,步骤复杂,从时间复杂度和空间复杂度的角度来说,性能都有待于提升。
思想:外层循环当前变量值i,在该位置之后的值,如果有两个值小于该值,则先在二层循环总进行处理,节省外层循环的内存量。
弊端:(来源于百科)选择排序是不稳定的排序方法(比如序列[5, 5, 3]第一次就将第一个[5]与[3]交换,导致第一个5挪动到第二个5后面)。
接下来将有一个关于算法系列的博客:每天晚上研究一点点,收获将是巨大的。(主要结合J2SE从内存的角度进行分析。)