可参考
https://github.com/hustcc/JS-Sorting-Algorithm
http://www.runoob.com/w3cnote/bubble-sort.html
插入排序
插入排序的代码实现虽然没有冒泡排序和选择排序那么简单粗暴,但它的原理应该是最容易理解的了,因为只要打过扑克牌的人都应该能够秒懂。插入排序是一种最简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
插入排序和冒泡排序一样,也有一种优化算法,叫做拆半插入。
1. 算法步骤
将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。
从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。)
2. 动图演示
void insert_sort(ElemType arr[], int len) {
for (int i = 1; i < len; i++) {
int key = arr[i];
int j = i - 1;
while ((j >= 0) && (key < arr[j])) {
arr[j + 1] = arr[j];
j--;
}
arr[j+1] = key;
}
}
希尔排序
希尔排序的基本思想就是:将需要排序的序列划分为若干个较小的序列,对这些序列进行直接插入排序,通过这样的操作可使需要排序的数列基本有序,最后再使用一次直接插入排序。
在希尔排序中首先要解决的是怎样划分序列,对于子序列的构成不是简单地分段,而是采取将相隔某个增量的数据组成一个序列。一般选择增量的规则是:取上一个增量的一半作为此次子序列划分的增量,一般初始值元素的总数量。
-
算法步骤:
初始化数组:
|
(1)使用元素总数量的一半(8)作为增量,将数屈打成招划分为8个序列,对这8个序列分别进行排序
|
(2)将增量缩小一半(值为4),重新划分子序列,得到4个子序列,对这4个子序分别进行排序,得到第2遍排序后的结果。
|
(3)缩小增量为2,得到如下结果:
|
(4)第4遍增量为1,得到最终的排序结果:
|
void shell_sort(ElemType arr[], int len) {
int dk = len / 2;
for (dk; dk >= 1; dk = dk / 2) {
for (int i = dk; i < len; i++) {
int key = arr[i];
int j = i - dk;
while (j>=0&arr[j]>key)
{
arr[j + dk] = arr[j];
j = j - dk;
}
arr[j + dk] = key;
}
}
}