代码改变世界

插入排序

2012-07-29 12:39  coodoing  阅读(419)  评论(0编辑  收藏  举报

1、算法原理介绍:

直接插入排序是一种最简单的排序方法,通过把序列中的值插入一个已经排序好的序列中,直到该序列的结束。即先将第1个记录看作是一个有序的记录序列,然后从第2个记录开始,依次将未排序的记录插入到这个有序的记录序列中去,直到整个文件中的全部记录排序完毕。

2、可视化操作:

具体的实现步骤为:

插入x之前:

插入x之后:

伪代码如下:

   1: for i ← 1 to i ← length(A)-1
   2:    {
   3:      // A[ i ] is added in the sorted sequence A[0, .. i-1]
   4:      // save A[i] to make a hole at index iHole
   5:      item ← A[i]
   6:      iHole ← i
   7:      // keep moving the hole to next smaller index until A[iHole - 1] is <;= item
   8:      while iHole >; 0 and A[iHole - 1] > item
   9:        {
  10:          // move hole to next smaller index
  11:          A[iHole] ← A[iHole - 1]
  12:          iHole ← iHole - 1
  13:        }
  14:      // put item in the hole
  15:      A[iHole] ← item
  16:    }

3、java代码实现

   1: static void insertSort(int[] a,int n )
   2:     {
   3:         for(int i =1;i<n;i++)
   4:         {
   5:             int p = a[i];
   6:             insert(a,i,p);
   7:         }
   8:     }    
   9:     
  10:     static void insert(int[] a, int index, int x) {
  11:         //元素插入数组a[0:n-1]
  12:         int i;
  13:         for(i=index-1;i>=0&&x<a[i];i--)
  14:         {
  15:             a[i+1] = a[i];
  16:         }
  17:         a[i+1]= x;
  18:         
  19:     }

4、时间复杂度

最佳运行时间即给定的元素为递增序列,时间复杂度为O(n)

最坏运行时间即给定的元素为降序序列,每次插入都需要同前面的所有元素进行比较,时间复杂度为O(n^2)