插入排序有:直接插入排序、二分法插入排序、希爾排序。
排序是一種很直觀的演算法,用一種視覺化的方法來觀察演算法的執行過程是很有用的,各位可以點選此鏈結來更加透徹得領悟各類排序演算法。
下面是直接插入排序
:基本思想就是,p從1開始一直往後移動,每次移動(即指外層迴圈的每次迴圈)前從索引0到p-1位置都是已經排好序的,每次移動後保證從索引0到p位置都是已經排序了的,看起來好像在內層迴圈要不停的交換元素,實際上不需要,只需要先把元素存起來,元素一直往後複製以覆蓋,最後迴圈結束後再賦值。這和堆的插入刪除演算法(即上濾下濾)是類似的。
因為有兩個迴圈,所以演算法的時間複雜度:
最壞情況:是o(
n2)。最好情況:
是o(n)。最好的情況就是資料已經預先排過序了。
平均情況:也是o(
n2)。
演算法是穩定
的。
public static >
void insertionsort( anytype [ ] a )
}
下面是二分插入排序
:基本思想就是,
p從1開始一直往後移動,每次移動(即指外層迴圈的每次迴圈)前
從索引0到p-1位置都是已經排好序的
,每次移動後保證從索引0到p位置都是已經排序了的。但是在尋找插入位置有點不一樣了,是通過二分查詢的思想來找。
二分插入排序的主要操作為比較+後移賦值。
最壞情況
:每次都在有序序列的起始位置插入,則整個有序序列的元素需要後移,時間複雜度為o(n2
)。最好情況
:待排序陣列本身就是正序的,每個元素所在位置即為它的插入位置,此時時間複雜度僅為比較時的時間複雜度,為o(l
og2n
)。平均情況
:o(n2)。
演算法是穩定
的。
public static void sort(int a)
else
}//退出whihe迴圈時,left肯定等於right+1,,而這個位置就是插入位置
for (int j = i - 1; j >= left; j--)
a[j + 1] = a[j];//元素往後移動
if(left!=i)//當i元素就應該放在i位置時,此時left就會等於i位置,但此時不需要進行插入
a[left] = temp; }}
下面是希爾排序:
基本思想是:
先取乙個小於陣列長度的整數d1作為第乙個增量
,把檔案的全部記錄分組,一共分為d1組。所有距離為d1的倍數的記錄放在同乙個組中。先在各組內進行直接插入排序
;然後,取第二個增量d2
希爾排序的時間複雜度與增量序列的選取有關:
如果是選取的希爾增量:
最壞情況:是o(n
2)。最好情況:是
o(n)。
平均情況:
演算法是不穩定的。
其餘的增量序列還有hibbard:,sedgewick:該序列中的項或者是9*4^i
- 9*2^i + 1或者是4^i - 3*2^i + 1。
public static >
void shellsort( anytype [ ] a )
}
插入排序演算法
插入排序演算法 思想 把排序過程看作是序列單個有序擴充套件為整體有序的過程,即首先取序列第二個元素與第乙個元素比較,將其插入合適位置,再將第三個元素與前兩個元素比較,將其插入合適位置,如此進行,直到最後取第n個元素與前n 1個元素進行比較並將其插入合適位置。演算法 建立日期 2004 12 14 插...
演算法 插入排序
include include 插入排序 n 2為的效率。具體思想 將陣列分為兩部分,一部分是有序的,一部分為無序的 然後從無序中選取乙個數插入在有序的數中的恰當的位置,以此迭代,直到無序的數全部遍厲完畢 void insert sort int a,int n a j tmp break retu...
插入排序演算法
下面這段話摘自 一般來說,插入排序都採用in place在陣列上實現。具體演算法描述如下 從第乙個元素開始,該元素可以認為已經被排序 取出下乙個元素,在已經排序的元素序列中從後向前掃瞄 如果該元素 已排序 大於新元素,將該元素移到下一位置 重複步驟3,直到找到已排序的元素小於或者等於新元素的位置 將...