排序演算法 插入排序(直接插入,二分插入,希爾)

2021-09-17 03:06:01 字數 1595 閱讀 1164

第乙個數預設有序。從第二個數開始,從後往前掃瞄。若取出數 < 當前數,則指標不斷前移,直到取出數 >= 當前數時,把取出數插入到當前位置。

public

static

int[

]insertsort

(int

arr)

arr[pre+1]

= cur;

}return arr;

}

以下過程具體說明了兩個數是怎麼實現有序的

pre

index: 1 2

data: 5 2 cur = 2

->

arr[pre+1] = arr[pre]

preindex: 1 2

data: 5 5 cur = 2

->

--pre

preindex: 0 1 2

data: 5 5 cur = 2

->

arr[pre+1] = cur;

preindex: 0 1 2

data: 2 5 cur = 2

最好的情況是序列已完全有序,則程式只for迴圈一次,while迴圈不執行,複雜度為o(n);最壞的情況是序列完全倒序,for迴圈掃瞄一輪,while迴圈也從後往前全部兩兩交換了一輪,複雜度為o(n^2); 平均複雜度為o(n^2);

該排序演算法不改變相同元素的相對位置,所以是穩定的。

直接插入第二種寫法

public

void

insert

(int

arr)

}}

利用二分查詢,能夠更快的定位元素,不用乙個個向前移動尋找了

public

void

insert

(int

arr)

}public

intbinarysearch

(int

arr,

int key,

int low,

int high)

return low;

}

使用了乙個增量,初始值為一般設為math.floor(arr.length / 2);該增量把序列劃分為幾個gap,對跨gap的數進行直接插入排序,而後gap為 math.floor(gap / 2),直到最後一輪 gap=1

public

static

int[

]insertsort

(int

arr)

arr[j]

= cur;}}

return arr;

}

外層for迴圈不是在做迴圈。內層for迴圈從初始gap值處開始遍歷陣列,複雜度情況與直接插入排序一致,若序列已有序,複雜度為o(n);若完全倒序,複雜度為o(n^2);平均複雜度問題未解決,尚為數學界難題。

該排序演算法改變相同元素的相對位置,所以是不穩定的。

插入排序 直接插入排序 二分插入排序 希爾排序

選擇排序是一種較為簡單的排序演算法。它的實現原理是每一次從待排序的資料元素中挑出乙個最小 大 的元素,存放在資料的起始 末尾 位置,直到所有待排序的資料排完。直接插入排序 當插入第i個元素的時候,我們認為它前面的i個元素已序。這時候用array i 的排序嗎與前面的排序碼進行比較,找到適合的位置就進...

排序演算法 插入排序 直接插入

借鑑的網上排序演算法資料 寫一下自己怎麼理解的直接插入排序的 只是為了自己看懂 以便忘記的時候檢視,希望大神不要噴,有什麼不好的可以指出 詳細的請看 public static int a public void print int a system.out.println test 檔案初態不同時...

排序 直接插入排序,二分插入排序,執行時間對比

typedef struct 可以 換成 struct,試了下也對 typedef struct node 順序表的儲存結構 typedef struct sqlist 順序表型別 換成 struct node 順序表的儲存結構 struct sqlist include include inclu...