标签:
算法过程:
序列S = {S0, S1, S2, ..., Sn-1}是n个可排序的序列,则
(1). 令i从1递增到n-1,重复步骤(2)-(5).
(2). 将元素Si保存到临时变量tmp,令j = i-1.
(3). 确定使条件tmp < Sj成立的最小j值,前提要保证j >= 0.
(4). 在(3)的过程中依次将子序列{Sj,...,Si-1}后移到{Sj+1,...,Si}.
(5). 将临时便令tmp放到Sj处。
public void insertSort(int[] array) { for (int i = 1; i < array.length; i++) { int tmp = array[i]; int j = i-1; while (j >= 0 && tmp < array[j]) { array[j+1] = array[j]; j--; } array[j+1] = tmp; } }
直接插入排序算法复杂度:
时间复杂度:无序 O(N2),反序O(N2),正序O(N)
空间复杂度:O(1)
直接插入排序是稳定的排序方法。
下面介绍希尔排序,希尔排序是直接插入排序的扩展,即把数据长度由1变成len/2。
算法过程:
(1). 先取一个小于n的数据长度间隔dataLen,不防令dataLen=len(array)/2.
(2). 当dataLen不等于0时,重复步骤(3)-(8).
(3). 令i从dataLen递增到n-1,重复步骤(4)-(7).
(4). 将元素Si保存到临时变量tmp,令j = i - dataLen.
(5). 确定使条件tmp < Sj成立的最小j值,前提要保证j >= 0。注意j 以dataLen递减,而不是1.
(6). 在(5)的过程中依次将子序列{Sj,...,Si-1}后移到{Sj+dataLen,...,Si-1+dataLen}.
(7). 将临时便令tmp放到Sj处.
(8). 重置dataLen=len(array)/2。
public void shellSort(int[] array) { int dataLen = array.length/2; while (dataLen != 0) { for (int i = dataLen; i < array.length; i++) { int tmp = array[i]; int j = i - dataLen; while (j >= 0 && tmp < array[j]) { array[j + dataLen] = array[j]; j -= dataLen; } array[j + dataLen] = tmp; } dataLen = dataLen/2; } }
直接插入排序算法复杂度分析:
希尔排序执行时间取决于数据长度间隔dataLen,时间性能优于直接插入排序,是一种不稳定的排序方法。
标签:
原文地址:http://www.cnblogs.com/lasclocker/p/4862194.html