第7章 排序
7.1排序的基本概念
(1)排序:就是重新排列表中的元素,使表中的元素滿足按關鍵字遞增或遞減的過程
(2)演算法穩定性:若待排序表中有兩個元素r1和r2,其對應的關鍵字key1=key2,且在排序前r1在r2的前面,若使用某一排序演算法排序後,r1仍然在r2的前面,則稱這個排序演算法是穩定,否則稱排序演算法是不穩定。
7.2插入排序
插入排序的基本思想:每次將乙個待排序的記錄按其關鍵字大小插入到前面已排好序的子串行中,直到全部記錄插入完成
7.2.1直接插入排序
(1)直接插入排序的基本思想:
要將元素l(i)插入到已有序的子串行l[1…i-1],需要執行以下操作:
1)查詢出l(i)在l[1…i-1]中的插入位置k。
2)將l[k…i-1]中所有元素全部後移乙個位置
3)將l(i)複製到l(k)
為了實現對l[1…n]的排序,將l(2)~l(n)依次插入到前面已排好序的子串行中,初始假定l[1]是乙個已經排好序的子串行。上述操作執行n-1次得到乙個有序的表。
(2)直接插入排序的分析
空間複雜度:o(1)
時間複雜度:最好情況o(n)、平均情況o(
穩定性:穩定
適用性:線性表為順序儲存、鏈式儲存
(3)例題:給出關鍵字序列的直接插入排序過程
初始序列:4,5,1,2,6,3
第一趟:4,5,1,2,6,3(將5插入)
第二趟:1,4,5,2,6,3(將1插入)
第三趟:1,2,4,5,6,3(將2插入)
第四趟:1,2,4,5,6,3(將6插入)
第五趟:1,2,3,4,5,6(將3插入)
【分析】直接插入排序每趟排序後不能確定乙個元素的最終位置,只有最後一趟結束後才能得到元素的最終位置。
(4)**:
#includeusing namespace std;
#define elemtype int
int main()
; insertsort(a,10); //直接插入排序
for(i=1;i<=10;i++) //輸出陣列元素
cout<
7.2.2 折半插入排序
(1)折半插入排序的基本思想:
比較和移動操作分離,先折半查詢出元素的待插入位置,然後統一地移動帶插入的位置之後的所有元素,將帶插入元素插入。
(2)折半插入排序的分析
空間複雜度:o(1)
時間複雜度:最好情況o(
穩定性:穩定
適用性:線性表為順序儲存
比較次數:o(nlog2n) ,比較次數與待排序表的初始狀態無關,僅取決於表中的元素個數n;而元素的移動次數並沒有改變,它依賴於待排序表的初始狀態
//折半插入排序
void insertsort(elemtype a,int n)
for(j=i-1;j>=high+1;--j)
a[j+1]=a[j]; //統一後移元素,空出插入位置
a[high+1]=a[0]; //插入操作}}
7.2.3希爾(shell)排序(縮小增量排序)(1)希爾排序的基本思想:
先將待排序表分割成若干形如l[i,i+d,i+2d,…,i+kd]的子表,分別進行直接插入排序,當整個表中的元素已呈「基本有序」時,再對全體記錄進行一次直接插入排序。
(2)希爾插入排序的分析
空間複雜度:o(1)
時間複雜度: 約o(n1.3
穩定性:不穩定
適用性:線性表為順序儲存
(3)例題:給出關鍵字序列的希爾排序過程(取增量序列為d=,排序結果為從小到大排列)
初始序列:50,26,38,80,70,90,8,30,40,20
第一趟(增量5):50,8,30,40,20,90,26,38,80,70
第二趟(增量3):26,8,30,40,20,80,50,38,90,70
第三趟(增量1):8,20,26,30,38,40,50,70,80,90
(4)**:
//希爾排序
void shellsort(elemtype a,int n)
}
資料結構 插入排序
演算法中經常會用到各種各樣的演算法,比較簡答的思想就是氣泡排序,一般剛開始程式設計時遇到排序問題時,會很容易想到冒泡排,氣泡排序是通過兩輛比較數值,從而將數字移動到開始或者末尾的位置,反覆重複這個過程從而就達到了排序的目的。其時間複雜度大概是 n2 還有一種比較常用的插入排序,其思想與氣泡排序比較類...
資料結構 插入排序
一 直接插入排序 1 直接插入排序的演算法思想 r i 的鍵值ki與r 0 r i 1 的鍵值依次比較 從後往前比 找到r i 應插入的位置,並把從該位置開始的記錄後移乙個位置,把r i 插入到找到的插入位置,完成一趟直接排序 重複選r i 1 r n 完成上述操作,直到排序完畢 注 為什麼要從後往...
資料結構 插入排序
插入排序的基本思想是 每步將乙個待排序的物件,按其關鍵字大小,插入到前面已經排好序的一組物件的適當位置上,直到物件全部插入為止。簡言之,邊插入邊排序,保證子串行中隨時都是排好序的。新元素插入到 在已形成的有序表中線性查詢,並在適當位置插入,把原來位置上的元素向後順移。關鍵字序列t 13,6,3,31...