J2SE-选择排序法初识

    如果说循环加数组是绝配的话,那么排序算法则是这二者结合之后的完美体现了。在学习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;
        }
    }
}

 
 

    算法优化:

                        J2SE-选择排序法初识_第1张图片

    如图所示,当第一层循环的下表为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从内存的角度进行分析。)




你可能感兴趣的:(选择排序法)