插入排序:
插入排序(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
最后进行重新赋值。
计算排序相等而言比较适用数据相差不大。
插入排序和选择排序运行上来相反的
前者比较所有剩余未排序数据找出最大(小)然后进行排序。
后者则是从已排序队列末尾开始比较找到大(小)于然后进行插入。
两个排序原理非常相近。
主要区别是选择排序是找到绝对顺序,而插入排序是相对。