排序算法(二)

插入排序:

插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法,它从第一个开始由后向前遍历数据,找到最合适的位置进行插入。重复的进行此操作直到数组末尾。

执行描述:
从第一个元素开始,该元素可以认为已经被排序了,
取出下一个元素与已经排序的元素进行从后往前的比较,如果小于则将该元素向前移动一位
重复操作,假如有N个元素最后一个就是第N个元素从后往前进行比较。
执行完最后一个元素说明排序完成。

算法实现(Java):

 /**
  * 插入排序
  */
 public static int[] InsertionSort(int[] array) {
  if (array.length > 0) {
   for (int i = 0; i < array.length - 1; i++) {
    int item = array[i + 1];
    int j = i;
    while (j > 0 && item < array[j]) {
     array[j + 1] = array[j];
     j--;
    }
    array[j + 1] = item;
   }
  }
  return array;
 }

计数排序:

计数排序(Counting sort)是一种稳定的排序算法,它将利用到一个额外的数组C,C数组长度为最大值减去最小值在加1。然后根据数组C来将A中的元素排到正确的位置。它只能对整数进行排序。

执行描述:
通过循环找出数组中的最小值与最大值,
创建一个额外的数组,长度为最大值减去最小值
根据数组C来将A中的元素排到正确的位置
最后对排序数组进行重新赋值

public static int[] countingSort(int[] array) {
  if (array.length > 0) {
   int min = array[0], max = array[0];
   for (int i = 1; i < array.length; i++) {
    if (array[i] > max) {
     max = array[i];
    }
    if (array[i] < min) {
     min = array[i];
    }
   }
   int[] intc = new int[max - min + 1];
   for (int i = 0; i < array.length; i++) {
    intc[array[i]-min] += 1;
   }
   int index = 0, j = 0;
   while (index < array.length) {
    if (intc[j] != 0) {
     array[index] = j + min;
     intc[j]--;
     index++;
    }else {
     j++;
    }
   }
  }
  return array;
 }

总结:

计数排序只是针对整数排序

假如有数组A为【2,3,7,5,3,1】,创建一个数组C长度为7(max) - 1(min) + 1 = 7

然后根据A数组对应的在这空的数组中添加值,C[A[i] - min] = C[A[i] - min] + 1

最后进行重新赋值。

计算排序相等而言比较适用数据相差不大。

插入排序和选择排序运行上来相反的

前者比较所有剩余未排序数据找出最大(小)然后进行排序。

后者则是从已排序队列末尾开始比较找到大(小)于然后进行插入。

两个排序原理非常相近。

主要区别是选择排序是找到绝对顺序,而插入排序是相对。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值