插入排序算法

插入排序算法

通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应的位置并插入。 插入排序非常类似于整扑克牌。在开始摸牌时,左手是空的,牌面朝下放在桌上。接着,一次从 桌上摸起一张牌,并将它插入到左手一把牌中的正确位置上。为了找到这张牌的正确位置,要将 它与手中已有的牌从右到左地进行比较。无论什么时候,左手中的牌都是排好序的。
如果输入数组已经是排好序的话,插入排序出现最佳情况,其运行时间是输入规模的一个线性函 数。如果输入数组是逆序排列的,将出现最坏情况。平均情况与最坏情况一样,其时间代价是(n2

java 实现


public class InsertSort {
 private int[] sourceArr;
  private int index = 0;
 
 public static void main(String[] args) {
  InsertSort insertSort = new InsertSort();
  int[] arr = new int[] { 86, 50, 23, 45, 32, 79, 2, 4, 1, 9, 5, 34, 12, 43, 11, 23, 11, 13, 10 };
  insertSort.sort(arr);
   System.out.println(Arrays.toString(arr));
   arr = new int[] { 86, 50, 23, 45, 32, 79, 2, 4, 1, 9, 5, 34, 12, 43, 11, 23, 11, 13, 10 };
  Arrays.sort(arr);
  System.out.println(Arrays.toString(arr));
 }
 public void sort(int[] arr) {
  this.sourceArr = arr;
  this.index = 1;
  int i = 1;
  for (; i < this.sourceArr.length; i++) {
   int vi = this.sourceArr[i];
   // 从 sourceArr 的尾部开始比较
   int j = this.index - 1;
   sortd(vi, j);
   this.index++;
  }
 }
 private void sortd(int vi, int j) {
  if (j >= 0) {
   int vj = this.sourceArr[j];
   // 比较找到适合的插入位置
   // this.targetArr[j-] < vi < this.targetArr[j]
   // 
   int c = comp(vi, vj);
   if (c == 1) {
    // 交换位置,
    this.sourceArr[j + 1] = vj;
    this.sourceArr[j] = vi;
    // 递归比较
    sortd(vi, j - 1);
    return;
   } else {
    // 当 c == 0, 或者 c == -1 直接插入 j + 1 的位置
    this.sourceArr[j + 1] = vi;
    return;
   }
  }
 }
 private int comp(int vi, int vj) {
  if (vi == vj) {
   return 0;
  } else if (vi > vj) {
   return 1;
  } else {
   return -1;
  }
 }
 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值