码迷,mamicode.com
首页 > 编程语言 > 详细

Java学习资料-Java常用算法-直接插入算法

时间:2015-01-26 19:32:32      阅读:176      评论:0      收藏:0      [点我收藏+]

标签:

SortAscending源程序
public class SortAscending {
 public SortAscending () {
  System.out.println("直接插入排序法");
 }

 public static int[] sortAscending(int[] with) { // 直接插入法递增排序
  int length = with.length;      // 待排数组的长度
  int[] temp = new int[length];    //建立一个新的数组用于存放排序结果
  temp[0] = with[0];        //初始化temp数组的元素为with[0]
  for (int i = 1; i < length; i++) {   //遍历with数组
   for (int j = i - 1; j >= 0; j--) {
    if (with[i] >= temp[j]) {    // 如果待排序列中的元素大于等于有有序序列中的元素,则插入
     temp[j + 1] = with[i];
     break;
    } else {
     temp[j + 1] = temp[j];    
     // 如果遍历到的元素小于已存在temp中的数组,则预留空间,在内循环的下次遍历中会temp[j]的空间会被with[i]填充,或者继续向前预留空间
     if (j == 0)
      temp[j] = with[i]; // with[[i]是有序序列中最小的,因此排在开头
    }
   }
  }
  return temp;
 }

 public static void main(String[] args) {
  int[] test1 = { 49  38  65  97  76  13  27  49 }; // 测试数组
  int[] temp1; // 中间变量
  temp1 = sortAscending(test1);
  
  for (int i = 0; i < temp1.length; i++) {
   System.out.print(temp1[i] + " ");
  }
 }
}
3.5.1.2 程序运行结果:
13 27 38 49 49 65 76 97
3.5.2 源程序揭秘
 直接插入法的实现可以有多种方式,并不是唯一的。算法通过新建一个数组存放比较结果,通过增加空间的复杂度,减少了算法的时间复杂度。
 遍历是每一个排序算法必不可少的过程,顺序地把待插入的数据元素按其关键字值的大小插入到已排序元素集合的适当位置。子集的元素个数从只有一个元素开始,逐次增大,当子集大小最终和集合大小相同时,排序完毕。
直接插入算法的数据结构:
? 待排序的数组with:该数组中含有with.length个元素
? 存放已排序的数组的子集的数组:temp
直接插入算法原理:
  直接插入排序法的排序原则是:将一组无序的数字排列成一排,左端第一个数字为已经完成排序的数字,其他数字为未排序的数字。然后从左到右依次将未排序的数字插入到已排序的数字中。
? 直接插入排序具体算法描述如下:
? 从第一个元素开始,该元素可以认为已经被排序;
? 取出下一个元素,在已经排序的元素序列中从后向前扫描 ;
? 如果该元素(已排序)大于新元素,将该元素移到下一位置;
? 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
? 将新元素插入到该位置中;
? 重复步骤2;
? 直接插入排序示例
49  38  65  97  76  13  27  49
49
38   49
39  49   65  97
38  49  65
38  49  65  76  97
13  38   49  65  76  97
13  27   38  49  65  76 97
13  27   38  49  49  65  76  97    

Java学习资料-Java常用算法-直接插入算法

标签:

原文地址:http://my.oschina.net/ysh3940/blog/371892

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!