初级排序算法
Posted lls101
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了初级排序算法相关的知识,希望对你有一定的参考价值。
排序算法类的模板
less()方法对元素进行比较,exch()方法将元素交换位置,show()方法打印数组.这个模板使用任何实现了Comparable接口的数据类型。
代码实现:
1 public class Example 2 private static boolean less(Comparable<Object> a,Comparable<Object> b) 3 4 return a.compareTo(b)<0; 5 6 7 private static void exch(Comparable<Object> [] ary,int i,int j) 8 9 Comparable<Object> temp=ary[i]; 10 ary[i]=ary[j]; 11 ary[j]=temp; 12 13 14 15 private static void show(Comparable<Object>[] ary) 16 17 for(int i=0;i<ary.length;i++) 18 19 System.out.print(ary[i]+" "); 20 21 System.out.println(); 22 23 private static boolean isSorted(Comparable<Object>[] ary) 24 25 for(int i=1;i<ary.length;i++) 26 27 if(less(ary[i],ary[i-1])) 28 return false; 29 30 31 return true; 32 33 public static void sort(Comparable<Object>[] ary) 34 35 36 //各种排序算法 37 38 39 40 public static void main(String[] args) 41 // TODO Auto-generated method stub 42 43 44 45
选择排序
首先,找到数组中最小的那个元素,其次将他和数组中的第一个元素交换位置(如果他就在第一位就和自己交换位置)。再次在剩下的元素中找到最小的元素,将他与第二个元素交换位置,以此类推,直到将整个数组排序。
代码实现:
1 int l=ary.length; 2 for(int i=0;i<l;i++) 3 4 int min=i; 5 for(int j=i+1;j<l;j++) 6 7 if(less(ary[j],ary[min])) 8 min=j; 9 10 exch(ary,i,min); 11
选择排序轨迹。
算法分析:
运行时间和输入无关,为找出最小元素进行的扫面不会对下一遍有任何帮助,这样你会发现如果对一个已经排序好的数组再进行选择排序,花费的时间和对无序数组排序花费的时间一样长。
数据移动是最少的,交换次数和数组大小是线性关系。
插入排序:
将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据。当前索引左边的所有元素都是有序的,但最终位置不确定,当索引到达最右端时,排序算法就算完成了。
代码实现:
1 int l=ary.length; 2 for(int i=1;i<l;i++) 3 4 for(int j=i;j>0&&less(ary[j],ary[j--]);j--) 5 6 exch(ary,j,j-1); 7 8
算法分析:
需要的时间取决于输入元素中的初始顺序,例如,当我们对一个已经排序好的数组使用插入排序时,他能立即发现该数组的每个元素都在合适的位置上
算法轨迹。
希尔排序
一种基于插入排序的算法,思想是使数组中任意间隔为H的数组都是有序的,这样的数组称为h有序数组,在进行排序时,如果h很大,就能将元素移动到很远的位置,为实现更小的h创造方便
希尔排序高效的原因在于排序之处,各个子数组都很短,排序之后的子数组都是部分有序的,这两种情况下都很适合插入排序。
代码实现:
1 int n=ary.length; 2 int h=1; 3 while(h<n/3) 4 h=3*h+1;//1,4,13.。。。。。。 5 while(h>=1) 6 7 for(int i=h;i<n;i++) 8 9 for(int j=i;j>=h&&less(ary[j],ary[j-h]);j-=h) 10 11 exch(ary,j,j-h); 12 13 14
算法轨迹
以上是关于初级排序算法的主要内容,如果未能解决你的问题,请参考以下文章