在已經排好序的序列中插入乙個數值使其成為新的有序序列
(教材定義:每次將乙個待排序的記錄,按其關鍵字大小插入到前面已經排好序的子串行中,直到全部記錄插入完成)
⚠️教材的定義體現了在原序列上進行的一種排序;
⚠️按照順序表的方式儲存的話,插入排序實際上就採用就地排序【空間複雜度o(1)】;
⚠️每次都要從在已排好的子串行中找到的位置開始整體將陣列元素向後移動。
#include
using
namespace std;
void
directsort
(int
*array,
int length)
;int
main()
;int length=10;
directsort
(array, length)
; cout<<
"result:"
;for
(int i=
1;i<=
10;i++
) cout<<<
" ";
cout
}//直接插入排序(遞增)
void
directsort
(int
*array,
int length)
}}*/
for(
int i=
2;i<=length;i++)}
}
tips:
直接插入排序的效能分析
效能分析
空間效率
常數個輔助單元,空間複雜度o(1)
時間效率
最好情況:表中元素已經有序,每次插入乙個只需要比較一次,時間複雜度o(n); 最壞情況:順序完全相反,總的比較次數和移動次數都達到最大o(n2 );平均複雜度o(n2)
穩定性穩定
適用性適用順序儲存和鏈式儲存;鏈式儲存就可以用第乙個那個思路,從前往後查詢指定元素的位置⚠️大多數排序演算法都僅適用於順序儲存的線性表
折半插入實際上就是把直接插入中的比較和移動拆成了兩步:
1、第一步:
利用了折半查詢,要明確折半的範圍應該是當前比較元素之前的元素是已經排列好的序列,以便據此設定high和low的值
2、第二步:
用high和low表示位置的時候,high+1/low-1,由於折半插入最後一步的特點
#include
using
namespace std;
void
middleinsert
(int
*array,
int length)
;int main ();
int length=10;
middleinsert
(array, length)
; cout<<
"result:"
;for
(int i=
1;i<=
10;i++
) cout<<<
" ";
cout
}void
middleinsert
(int
*array,
int length)
//元素移動
//從後面開始的,因為都是在待比較元素之前的序列
for(j=i-
1;j>high;j--
) array[high+1]
=array[0]
;}}
折半插入排序效能分析
效能分析
空間o(1)
時間減少了比較次數,與待排序表的初始狀態無關,僅僅取決於表中元素個數n,o(nlog2n);元素移動次數沒有改變,它依賴於元素的初始狀態;總的時間複雜度o(n2)
穩定性穩定
適用性順序表,鍊錶no
2023年,d.l.shell提出shell排序,又稱縮小增量排序。
基本思想:先將待排序表按照希爾增量分割成若干個子表,然後對每個子表進行直接插入排序;按照一定的規律改變希爾增量,然後再次對子表進行直接插入排序,直到希爾增量為1。
⚠️目前尚未求得乙個好的增量序列,希爾提出的方法是/2取地板
#include
using
namespace std;
void
shellsort
(int
* array,
int length)
;int main ();
int length=10;
shellsort
(array,length)
; cout<<
"result:"
;for
(int i=
1;i<=
10;i++
) cout<<<
" ";
cout
}//兩種方法:一種是傳入shell,一種是直接在shellsort中設定好shell
void
shellsort
(int
*array,
int length)}}
}
shell sort效能分析
效能分析
空間o(1)
時間分析較困難,涉及數學上尚未解決的難題。當n在某個範圍內的時候,約為o(n1.3);最壞情況o(n2)
穩定性不穩定
適用性僅適用於順序表
排序演算法(一) 插入排序
首先,對排序演算法 輸入 n 個數 輸出 序列的乙個排序,使得a1 a2 an 待排序的數為key 插入排序演算法,是乙個對少量元素進行排序的有效演算法.其偽 如圖 插入排序演算法在形式上類似於我們平時打牌時,邊抽牌邊整理撲克牌的順序,我們將新的牌與手中已經整理好順序的撲克牌進行比較,最終將抽到的牌...
排序演算法(一) 插入排序
一 插入排序 直接插入 二分插入 希爾排序 基本思想 從前面已經排序好的資料中查詢合適的位置,將待排序資料插入到該位置 從後面向前找合適的位置 1 直接插入排序 基本思想 從右向左查詢 從左邊已排序好的資料中查詢合適的位置,插入待排序的資料。private static void derictins...
排序演算法 一 插入排序
演算法實現 insertsort.c include void insertsort int arr,int len int i 0,j 0,k 0 int tmp 0 for i 1 i 0 tmp演算法思想 保證被比較值的左側為有序,在將被比較的值插入到這個有序的佇列裡。例子分析 1.首先arr...