算法学习--选择排序和插入排序

来源:互联网 发布:linux firefox找不到 编辑:程序博客网 时间:2024/06/07 02:16

1.选择排序

思想:首先,找到数组中最小的那个元素,其次,将它与数组中第一个元素交换位置。然后,在剩下的元素中在找到最小的值,将它与数组中第二个元素交换位置。这种不断选择最小元素的排序称为选择排序。

代码实现:1.首先是比较两个值大小的方法,使用了compareto方法,改方法返回0,1,-1.若v<w返回负1。

 private static boolean less(Comparable v,Comparable w)    {        return v.compareTo(w)<0;    }
2.交换两个元素的位置

private static void exch(Comparable[] a,int i,int j)    {        Comparable t=a[i];        a[i]=a[j];        a[j]=t;    }

3.选择排序算法。

 public static void sort(Comparable[] a){        int N=a.length;        for(int i=0;i<N;i++)        {            //内循环,将a[i]与a[i+1]到a[n-1]中的最小元素交换            int min=i;//用min作为最小元素的索引,先假设a[i]为最小元素            for(int j=i+1;j<N;j++)            {

//如果a[min]>a[j] 交换

if(less(a[j], a[min])) { min=j; exch(a, min, j); } } } }

2.插入排序

思想:与选择排序一样,当前索引左边的所有元素都是有序地,但他们的最终位置还不确定,所以将大的元素排到右边去,当索引

到达数组的最右边时,排序完成。
代码实现:1.插入排序算法
 public static void SelectSort(Comparable[] a){        int N=a.length;        for(int i=0;i<N;i++){            //内循环中只判断当前索引是否比前一个索引处的值小,如果小,交换位置,保证了当前索引左边的是排序好的。            for(int j=i;j>0&&less(a[j], a[j-1]);j--)            {                exch(a, j, j-1);            }        }    }

3.总结

首先,我们可以发现排序算法的问题,就是不管当前数组是否为有序数组,或者接近有序数组,它都要进行循环。所以这个

算法的效率是不够高的。但是插入算法能够立即发现每个元素是否在合适的位置上,而且循环判断与访问数组的次数明显减少,效率

较快。

 



原创粉丝点击