java数组的插入排序以及时间复杂度
插入排序的思想是把前面的排好依次往下進(jìn)行遍歷,發(fā)現(xiàn)比最后一個(gè)數(shù)小的把它插入排好序的最后一個(gè)數(shù)的前面,此時(shí)排好的數(shù)組可能已經(jīng)不再有序,就對(duì)它進(jìn)行維護(hù),以此重復(fù)上述操作
具體步驟:定義一個(gè)指針i,再定義一個(gè)指針j,i最開始指向數(shù)組的第二個(gè)數(shù),j指向i的前一個(gè)數(shù),然后讓j和他后面的數(shù)進(jìn)行比較,如果后面的數(shù)比j小就讓他倆交換(如果不交換說明前面已經(jīng)排好序),然后再讓指針j指到j(luò)的前一個(gè)數(shù),在讓j和j后面的數(shù)進(jìn)行比較如果比j指針指向的數(shù)大就再進(jìn)行交換,以此循環(huán)直到j(luò)后面的數(shù)比j大或j指向數(shù)組的第一個(gè)數(shù),就讓指針i指向下一個(gè)數(shù),以此循環(huán)直到i指向數(shù)組最后一個(gè)數(shù)。排序完成。
數(shù)組按插入排序全過程如下圖:
?
?
?
?
?
插入排序代碼如下:
public class Insertsort {public static void main(String[] args) {//定義無序數(shù)組int[] arr= {23,43,1,22,67,123,88,99,90,15};sort(arr);}private static void sort(int[] arr) {//第一次for循環(huán),即對(duì)每個(gè)數(shù)都進(jìn)行遍歷,i就是上面所說的i指針for(int i=1;i<arr.length;i++) {//第二次for循環(huán),每次j開始都是i的前一個(gè)數(shù),然后向前走以維護(hù)前面已排好序的數(shù)組即j--for(int j=i-1;j>=0;j--) {//判斷如果j比后面數(shù)大就進(jìn)行交換,然后j--進(jìn)行維護(hù)if(arr[j]>arr[j+1]) {arr[j]^=arr[j+1];arr[j+1]^=arr[j];arr[j]^=arr[j+1];}else{//j比后面數(shù)小此層for循環(huán)結(jié)束,因?yàn)闆]必要繼續(xù)遍歷以減小時(shí)間頻率,break;}} }System.out.println(Arrays.toString(arr)); }}結(jié)果如下:
?時(shí)間復(fù)雜度:外層for循環(huán)時(shí)間復(fù)雜度是O(n)最壞情況里層需要每次遍歷到數(shù)組的第一個(gè)數(shù)即里層時(shí)間復(fù)雜度是O(n),所以最壞情況下插入排序的時(shí)間復(fù)雜度是o(n^2)
這也是插入排序的弊端所以產(chǎn)生一個(gè)希爾排序來降低它的時(shí)間復(fù)雜度。
總結(jié)
以上是生活随笔為你收集整理的java数组的插入排序以及时间复杂度的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 晶体三极管及其基本放大电路
- 下一篇: 为出海掘金创造更多可能 助力开发者触达全