插入排序(Insertion Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。
一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下:
C语言:
void insertion_sort(int array[], int first, int last) { int i,j; int temp; for (i = first+1; i<=last;i++) { temp = array[i]; j=i-1; //與已排序的數逐一比較,大於temp時,該數向後移 while((j>=first) && (array[j] > temp)) //当first=0,j循环到-1时,由于[[短路求值]],不会运算array[-1] { array[j+1] = array[j]; j--; } array[j+1] = temp; //被排序数放到正确的位置 } }
C++:
这是c++语言版本的插入排序法。为了支援list使用了std::advance()。
#include <iterator> template<typename biIter> void insertion_sort(biIter begin, biIter end) { typedef typename std::iterator_traits<biIter>::value_type value_type; biIter bond = begin; std::advance(bond, 1); for(; bond!=end; std::advance(bond, 1)) { value_type key = *bond; biIter ins = bond; biIter pre = ins; std::advance(pre, -1); while(ins!=begin && *pre>key) { *ins = *pre; std::advance(ins, -1); std::advance(pre, -1); } *ins = key; } }
C#:
public static void InsertSort(double[] data) { var count = data.Length; for (int i = 1 ; i < count ; i++) { var t = data[i]; var j = i; while (j > 0 && data[j - 1] > t) { data[j] = data[j-1]; --j; } data[j] = t; } }
Java源代码:
public class Insertion { public static void insertionSort(Comparable []data){ for(int index=1;index<data.length;index++){ Comparable key = data[index]; int position = index; //shift larger values to the right while(position>0&&data[position-1].compareTo(key)>0){ data[position] = data[position-1]; position--; } data[position]=key; } } public static void main(String []args){ Comparable []c={4,9,23,1,45,27,5,2}; insertionSort(c); for(int i=0;i<c.length;i++) System.out.println("插入排序:"+c[i]); } }