初级排序算法

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 
View Code

 

选择排序

首先,找到数组中最小的那个元素,其次将他和数组中的第一个元素交换位置(如果他就在第一位就和自己交换位置)。再次在剩下的元素中找到最小的元素,将他与第二个元素交换位置,以此类推,直到将整个数组排序。

代码实现:

技术图片
 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      
View Code

技术图片

选择排序轨迹。

算法分析:

运行时间和输入无关,为找出最小元素进行的扫面不会对下一遍有任何帮助,这样你会发现如果对一个已经排序好的数组再进行选择排序,花费的时间和对无序数组排序花费的时间一样长。

数据移动是最少的,交换次数和数组大小是线性关系。

 

插入排序:

将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据。当前索引左边的所有元素都是有序的,但最终位置不确定,当索引到达最右端时,排序算法就算完成了。

代码实现:

技术图片
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     
View Code

算法分析:

需要的时间取决于输入元素中的初始顺序,例如,当我们对一个已经排序好的数组使用插入排序时,他能立即发现该数组的每个元素都在合适的位置上

技术图片

算法轨迹。

希尔排序

一种基于插入排序的算法,思想是使数组中任意间隔为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     
View Code

技术图片

算法轨迹

 

以上是关于初级排序算法的主要内容,如果未能解决你的问题,请参考以下文章

算法(第4版)-2.1 初级排序算法

初级排序算法

初级排序算法

初级排序算法

算法-初级-数组删除排序数组中的重复项(多语言版实现)

2.1 初级排序算法