讓我們開始排序的學習吧,首先我們先理解一下插入排序的基本思想:每一趟將乙個待排序的記錄,按其關鍵字的大小插入到已經排好序的一組記錄的適當位置上,知道所有待排序記錄全部插入為止。(這個可能會和選擇排相似,但是那個是設定最大或最小,然後依次找到最大或最小插入到特定位置,而選擇依次比較後移或前移,不要混淆哦)。
這個大家都應該很清楚,之前的我們在寫這個操作的時候是查詢到位置之後把元素放到這個位置,然後其後的元素向後移動。而這裡我們給出的演算法是邊查詢邊移動。(和查詢一樣也設定崗哨避免越界,自i-1起往前查詢)。
【演算法描述】
void
insertsort
(sqlist &l)
}
我們發現上述的直接插入排序在查詢的時候是順序查詢,所以我們在進行查詢操作的時候利用「折半查詢」來實現,是不是查詢的時間複雜度就更好了呢!(之前查詢的時候我們只關注查詢的時間複雜度,現在排序之後我們就需要關注查詢、移動的時間複雜度)。
【演算法描述】
void
binsertsort
(sqlist &l)
//while
for(j=i-
1;j>=high+1;
--j) l.r[j+1]
=l.r[j]
;//記錄後移
l.r[high+1]
=l.r[0]
;//將r[0]即原r[i],插入到正確位置
}//for
}//binsertsort
但是聰明的你會想,會不會有更好的方法,從「減少記錄個數」和「序列基本有序」兩個方面對直接插入排序再進行改進呢?——答案就是希爾排序啦。(核心就是增量)
【演算法步驟】
[1]第一趟取增量d1(d1
1個組,所有間隔為d1的記錄分在同一組,在各個組中進行直接插入排序。
[2]第二趟去增量d2(d2
1),重複上述的分組和排序。
[3]依次類推,知道所取的增量d1=1,所有記錄在同一組中進行直接排序為止
(這裡我們通常會取5,3,1這幾個數字作為增量)。
來,看看圖理解一下。
你看這個圖中的例子,第一次增量是5,然後就找到交換位置,第二次也是如此。
這裡給出希爾排序的演示程式:
// 希爾排序
#include
using
namespace std;
#define maxsize 20
//順序表的最大長度
typedef
struct
elemtype;
//順序表的儲存結構
typedef
struct
sqlist;
//順序表型別
void
shellinsert
(sqlist &l,
int dk)
//for
}//shellinsert
void
shellsort
(sqlist &l,
int dt,
int t)
//shellsort
void
create_sq
(sqlist &l)
for(i=
1;i<=n;i++)}
void
show
(sqlist l)
void
main()
shellsort
(l,dt,t)
; cout<<
"排序後的結果為:"
<
show
(l);
}
排序1 插入排序
排序1 插入排序 以從小到大排序為例 重點關注各種排序時間複雜度,空間複雜度,已經有序的時間空間複雜度,穩定性的對比 1.1原理 舉例說明更清晰 設原資料 5 9 4 7 2 移動後面資料 for int k i 1 k j k 插入資料 arr j tmp 1.3評價 時間複雜度 o n 2 空間...
1)插入排序
直接插入排序的理解 來自維基百科 一般來說,插入排序都採用in place在陣列上實現。具體演算法描述如下 從第乙個元素開始,該元素可以認為已經被排序 取出下乙個元素,在已經排序的元素序列中從後向前掃瞄 如果該元素 已排序 大於新元素,將該元素移到下一位置 重複步驟3,直到找到已排序的元素小於或者等...
1 插入排序
本來是想對插入排序做乙個詳細的說明 從演算法原理 演算法優劣 演算法實現一一說起。但是要將演算法原理說的通俗易懂,不是個簡單的事情,常常需要很好的文筆和配上詳細的圖。但是最近需要複習準備面試,確實沒什麼時間去寫一系列完整地說明演算法的部落格,所以這次就只是寫下演算法實現 c 的細節和詳細注釋,找到新...