直接插入排序

直接插入排序应用了插入排序的基本思想:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中的适当位置,直到全部记录插入完成为止。

直接插入排序算法的基本思想:

  在一个已经有序的小序列的基础上,一次插入一个元素。当然,刚开始这个有序的小序列只有1个元素,就是第一个元素。比较是从有序序列的末尾开始,也就是想要插入的元素和已经有序的最大者开始比起,如果比它大则直接插入在其后面,否则一直往前找直到找到它该插入的位置。如果碰见一个和插入元素相等的,那么插入元素把想插入的元素放在相等元素的后面。所以,相等元素的前后顺序没有改变,从原无序序列出去的顺序就是排好序后的顺序,所以插入排序是稳定的。

1.简单方法
     首先在当前有序区arr[0..i-1]中查找arr[i]的正确插入位置j(0≤j≤i-1);然后将arr[j..i-1]中的记录均后移一个位置,腾出j位置上的空间插入arr[i]。
  注意:
     若arr[i]的关键字大于等于arr[0..i-1]中所有记录的关键字,arr[i]就是插入原位置。
2.改进的方法
  一种查找比较操作和记录移动操作交替地进行的方法。
具体做法:
     将待插入记录arr[i]的关键字从右向左依次与有序区中记录arr[j](j=i-1,i-2,…,0)的关键字进行比较:
     ① 若arr[j]的关键字大于arr[i]的关键字,则将arr[j]后移一个位置;
        ② 若arr[j]的关键字小于或等于R[i]的关键字,则查找过程结束,j+1即为arr[i]的插入位置。

 

 1 package com.bingoogol.algorithm.sort;
 2 
 3 /**
 4  * 直接插入排序
 5  * 
 6  * @author bingoogol@sina.com
 7  */
 8 public class InsertSort {
 9 
10     public static void main(String[] args) {
11         int[] arr = new int[] { 2, 6, 30, 25, 9, 18, 13 };
12         System.out.print("排序前:");
13         InsertSort.printArr(arr);
14         InsertSort.sort(arr);
15         System.out.print("排序后:");
16         InsertSort.printArr(arr);
17     }
18 
19     public static void sort(int[] arr) {
20         for (int i = 1; i < arr.length; i++) {
21             int temp = arr[i];
22             int j = i - 1;
23             while (j >= 0 && arr[j] > temp) {
24                 arr[j + 1] = arr[j];
25                 j--;
26             }
27             arr[j + 1] = temp;
28         }
29     }
30 
31     public static void swap(int[] data, int i, int j) {
32         int temp = data[i];
33         data[i] = data[j];
34         data[j] = temp;
35     }
36 
37     public static void printArr(int[] arr) {
38         for (int i = 0; i < arr.length - 1; i++) {
39             System.out.print(arr[i] + ",");
40         }
41         System.out.println(arr[arr.length - 1]);
42     }
43 }
查看Java语言版代码

 

 

 

 

posted @ 2013-11-19 16:50  bingoogolapple  阅读(226)  评论(0编辑  收藏  举报