zoukankan      html  css  js  c++  java
  • 初级排序算法

    排序算法类的模板

    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

    算法轨迹

  • 相关阅读:
    Oracle递归查询,Oracle START WITH……CONNECT BY查询
    jquery Ajax请求示例,jquery Ajax基本请求方法示例
    Jquery EasyUI Combotree和 EasyUI tree展开所有父节点和获取完整路径
    Jquery EasyUI Combotree根据选中的值展开所有父节点
    Jquery EasyUI Combotree 初始化赋值
    Jquery EasyUI Combotree只能选择叶子节点且叶子节点有多选框
    SpringBoot Mybatis整合(注解版),SpringBoot集成Mybatis(注解版)
    SpringBoot Druid整合,SpringBoot 集成Druid
    安卓TTS语音合成经验分享(科大讯飞语音+)集成
    delphi7的新生,参与分布式应用开发,调用RESTful API,Json的应用
  • 原文地址:https://www.cnblogs.com/lls101/p/11220322.html
Copyright © 2011-2022 走看看