插入排序算法(排序详解)

                                                      直接插入排序(Insertion Sort)算法

1.基本思想:

        每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子序列中的适当位置,直到全部记录插入完成为止。待排序记录 R1,R2,… ,Rn–1, Rn,操作顺序如下:


                          第一步:R1
                         {第一个无需操作}

                          第二步:(R1 ), R2
                         {比较R1与R2的大小,大则放后面,否则放前面}

                          第三步:(R1 , R2), R3

                         ……
                         第 j 步:(R1,R2,… ,Rj–1), Rj
                         {储存Rj的值,从后往前遍历寻找,如果找到Rk>Rj&&Rk-1>=Rj或者k==0,停止,将Rj放到Rk前面一个位置}

                         ……
                         第 n 步: (R1,R2,… ,Rn–1), Rn

                         例:j=5
                         原有序表中关键词比Rj大的记录数:dj
                         比较次数:dj+1 移动次数: dj+2

2.哨兵的作用
     算法中引进的附加记录R[0]称监视哨或哨兵(Sentinel)。
     哨兵有两个作用:
  ① 进人查找(插入位置)循环之前,它保存了R[i]的副本,使不致于因记录后移而丢失R[i]的内容;
  ② 它的主要作用是:在查找循环中"监视"下标变量j是否越界。一旦越界(即j=0),因为R[0].key和自己比较,循环判定条件不成立使得查找循环结束,从而避免了在该循环内的每一次均要检测j是否越界(即省略了循环判定条件"j>=1")。
  注意:
    ① 实际上,一切为简化边界条件而引入的附加结点(元素)均可称为哨兵。
    【例】单链表中的头结点实际上是一个哨兵
  ② 引入哨兵后使得测试查找循环条件的时间大约减少了一半,所以对于记录数较大的文件节约的时间就相当可观。对于类似于排序这样使用频率非常高的算法,要尽可能地减少其运行时间。所以不能把上述算法中的哨兵视为雕虫小技,而应该深刻理解并掌握这种技巧。

3.模拟动画

            动画模拟

4.Java 代码:

public static void insertSort(int a[]) {
		for (int i = 1; i < a.length; i++) {
			// 带插入元素
			int temp = a[i];
			int j;
			for (j = i - 1; j >= 0; j--) {
				if (a[j] > temp) {
					a[j + 1] = a[j];
				} else
					break;
			}
			a[j + 1] = temp;
		}
	}


你可能感兴趣的:(java,算法,基础,插入排序,初学)