插入排序和希尔排序

可参考

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;
		}

	}
}

 

你可能感兴趣的:(数据结构与算法)