InsertionSort_插入排序

来源:互联网 发布:java雷霆战机开发视频 编辑:程序博客网 时间:2024/06/04 16:37
  • 关键码:数据元素中某个数据项的值;
    - 例如,学生信息中的学号即为主关键码
    - 若在待排序的纪录中,存在两个或两个以上的关键码值相等的纪录,经排序后这些记录的相对次序仍然保持不变,则称相应的排序方法是稳定的方法,否则是不稳定的方法。

-内部排序和外部排序
- 根据排序过程中涉及的存储器不同:
- 内部排序:待排序数据主要存储在随机存储器(内存)
- 外部排序,指的是排序中要对外存储器进行访问的排序过程


-直接插入排序
(从第二个开始,每一个元素分别与其前面的所有元素挨个比较,如果比其小就前移一位知道)
- 算法思路:
(1) 设置监视哨r[0],将待插入纪录的值赋值给r[0];
(2) 设置开始查找的位置j;
(3) 在数组中进行搜索,搜索中将第j个纪录后移,直至r[0].key≥r[j].key为止;
(4) 将r[0]插入r[j+1]的位置上。

public void zjinsert (Redtype r[],int n){int I,j;Redtype temp;for (i=1;i<n;i++){temp = r[i];j=i-1;while (j>-1 &&temp.key<r[j].key){r[j+1]=r[j];j--;}r[j+1]=temp;}}

-折半插入排序(二分插入排序)

  • 基本过程:

(1)计算 0 ~ i-1 的中间点,用 i 索引处的元素与中间值进行比较,如果 i 索引处的元素大,说明要插入的这个元素应该在中间值和刚加入i索引之间,反之,就是在刚开始的位置 到中间值的位置,这样很简单的完成了折半;
(2)在相应的半个范围里面找插入的位置时,不断的用(1)步骤缩小范围,不停的折半,范围依次缩小为 1/2 1/4 1/8 …….快速的确定出第 i 个元素要插在什么地方;
(3)确定位置之后,将整个序列后移,并将元素插入到相应位置。