折半插入排序
希爾排序
各演算法複雜度表
插入排序主要包括三個:直接插入排序、折半插入排序和希爾排序。基本思想都是:
每次將乙個待排序的記錄,按其關鍵字大小插入到前面已經排好序的子串行中,直到全部記錄插入完成。下面依次進行講解並程式設計實現。
主要思想:
1. 迴圈i從1~n-1
,每次迴圈執行步驟2-4。
2. 查詢arr[i]
在arr[0]~arr[i-1]
的插入位置k。
3. 將arr[k]~arr[i-1]
每個元素後移乙個位置。
4. 將arr[i]
複製到arr[k]
。
如圖所示:
時間複雜度:
平均下來,約為((
n2+n
)/4)
次,複雜度為o(
n2) 。
穩定性:穩定
適用性:用順序表時,從後往前比較,比較後直接交換;單鏈表的話,從前往後查詢。
核心**如下:
void insertsort(int arr, int n)}}
更一般的,可以引入哨兵arr[0]
,(哨兵:簡化邊界條件而引入的附加結點)有兩個作用:
1. 可以減少臨界的比較,即不用比較j>=0
2. 暫時存放待插入的元素
如下:
void insertsort(int arr, int n)//這裡n是待排序數個數,不包括哨兵}}
如果待排序的是結構的話,也一樣:
#include
using
namespace
std;
struct elem
elem(int key) :key(key){}
bool
operator
< (const elem& other)
elem& operator = (const elem& other)
friend ostream& operator
<< (ostream &stream, const elem &e)
};void print(elem arr, int n, int i)
cout
<< endl;
}void insertsort(elem arr, int n)
print(arr, n+1, i-1);
}}int main()
,, , , , , , , };
print(arr, 9, 0);
insertsort(arr, 8);
system("pause");
}
第0輪: 0 6 5 3 1 8 7 2 4
第1輪: 5 5 6 3 1 8 7 2 4
第2輪: 3 3 5 6 1 8 7 2 4
第3輪: 1 1 3 5 6 8 7 2 4
第4輪: 1 1 3 5 6 8 7 2 4
第5輪: 7 1 3 5 6 7 8 2 4
第6輪: 2 1 2 3 5 6 7 8 4
第7輪: 4 1 2 3 4 5 6 7 8
思路是:由於前一部分是已排序的,所以不再一次次比較,而是二分查詢到待插入元素應該在哪個位子,再插入,後移操作統一放到一起。
void insertsort(int arr, int n)
for (j = i - 1; j>=high+1 ; --j)//high+1到i-1的數後移
arr[j + 1] = arr[j];
arr[high + 1] = arr[0];//待插入數放到high+1}}
用了二分查詢僅減少了比較的複雜度,從o(
n2) 到o(
nlog
2n) ,且次數與數列初始狀態無關,僅取決於個數n,即最好情況最差情況都是這麼多。
移動次數仍然一樣,但移動次數與數列初始狀態有關,最好情況為0,最差情況複雜度為o(
n2) ;
故總的來說,時間複雜度
平均為o(
n2) 。
穩定性:穩定。
空間複雜度:o(
1)
基本思路:先將待排序表分割成若干個形如l[
i,i+
d,i+
2d,.
..i+
kd] 的特殊子表,分別進行直接插入排序,隨著
d 不斷減小至1,整個表也會趨向於「基本有序」,最後
d為1時,進行一次整體的直接插入排序。
和直接插入相比,演算法修改為:
1. 前後比較增量為dk,不是1。
2. arr[0]不再是哨兵,而僅作為暫時儲存用,即判斷越界用不到了。
void shellsort(int arr, int n)}}
}
空間複雜度:用了3個輔助單元,為o(
1)時間複雜度:依賴於增量序列的函式。
穩定性:不穩定。
適用性:僅適用於順序儲存的線性表。(因為增量不為1,要能以常數時間訪問到任何乙個元素,鏈式就不行了。)
演算法平均時間複雜度
最好時間複雜度
最差時間複雜度
空間複雜度
穩定性備註
直接插入排序o(
n2) o(
n)o(
n2) o(
1)穩定
折半插入排序o(
n2) o(
nlog
2n) o(
n2) o(
1)穩定
shell排序o(
n1.3
) o(
n)o(
n2) o(
1)不穩定
和增量序列有關
資料結構 排序之插入排序
插入排序o n2 的執行時間 思想是 若陣列長度為n 那麼把陣列序號從1到n 1的值依次往前進行比較 這裡需要乙個for迴圈 注意每個數在比較的時候它前面的資料都是已經排好序號的 因為從序號為1時就開始排序了 注意我們這裡用類似堆中下浮和上浮的交換方法 把需要交換的資料拿出來 和前面的資料依次進行比...
資料結構排序之插入排序
package sort 最簡單的排序演算法之一是插入排序 insertion sort 插入排序由n 1躺排序組成。對於 p 1到n 1 趟,插入排序保證從位置0到位置p上的元素為已排序狀態。插入排序利用了這樣的 事實 已知位置0到位置p 1 上的元素處於排過序的狀態。例子 原始陣列 34 8 6...
資料結構之插入排序 折半插入排序
排序思路 通過折半查詢的方式找到合適的插入位置再插入。演算法實現 public class biinsertsort else 插入點在 mid 1,right left mid 1 直到找到合適的位置 left或right 1 接下來就將left right 1後的元素後移 for int j i...