排序算法------插入排序

     现在,我怕的并不是那艰苦严峻的生活,而是不能再学习和认识我迫切想了解的世界。对我来说,不学习,毋宁死。——罗蒙诺索夫

       插入排序是最简单的排序算法之一。它由N-1趟排序组成。对于p=1到N-1趟,插入排序保证从位置0到位置p上的元素为已排序状态。具体的步骤如下:

  1. 从第一个元素开始,该元素可以认为是有序的。
  2. 取出下一个元素,对数组下标1处的元素进行排序,即在已经排序的元素序列中从后向前扫描,如果该元素小于前面的元素,则依次与前面元素进行比较如果小于则交换,直到找到大于该元素的就则停止。
  3. 如果该元素大于前面的元素,则重复步骤2
  4. 重复步骤2-3知道所有元素都排好序。

代码

public static void insertSort(T[] array){
    int n = array.length;
    for(int i=1;i<n;i++){
       for(j=i;j>0;j--){
           if(array[j].CompareTo(array[j-1])<0){
               swap(array,j,j-1);
           }else{
               break;
           }
       }
    }
}


private static void swap(T[] array,int i, int min){
   T temp = array[i];
   array[i] = array[min];
   array[min] = temp;
}

插入排序算法优化

        其中,对于交换操作,可以优化成移动操作,即不直接进行两个元素的交换,还是用一个枢轴元素(tmp)将当前元素先保存起来,然后执行移动操作,待确定了最终位置后,再将当前元素放入合适的位置。

 public static <T extends Comparable<? super T>> void insertSort(T[] a){
         for(int p = 1; p < a.length; p++)
         {
            T tmp = a[p];//保存当前位置p的元素,其中[0,p-1]已经有序
            int j;
            for(j = p; j > 0 && tmp.compareTo(a[j-1]) < 0; j--)
            {
                    a[j] = a[j-1];//后移一位
            }
           a[j] = tmp;//插入到合适的位置       
         }
}

猜你喜欢

转载自my.oschina.net/u/3475585/blog/1807057