插入排序很好理解,與實際生活緊密相連,或可以說是**於生活中的感悟。
插入排序是用的非常多的一種排序方法,因為在實際程式設計中,資料往往是排序好的
所以往排序好的資料中插入新數,此時用插入排序會特別快速。
假設十個人按排隊,從矮到高,你會怎麼排?
首先,第2人與第1人比,若2比1矮,那麼他們互換位置,否則不動,此時前兩位已經排好了
然後第3人站出來,看看前面哪個位置中,自己比左邊的高,右邊的矮,然後插進去,若是前面人中最高的,
就不動。此時前3人排好了,以此類推。
程式中要先用乙個變數儲存這個「站出來的」數。直到此數找到比ta矮的人,那時留出乙個空位,可以插入。
/*
在一維亂序的陣列中
使用插入排序,實現從小到大排列
*/#include int main(void)
; int n = sizeof(a)/sizeof(a[0]); // 陣列元素的個數
for(i=1; i= 0) && (a[j] > temp))
if(j != i-1)
/*j != i-1說明執行過上面while,並找到了位置,那麼插入
如果j = i-1,則說明沒有執行while,說明它與左邊比是最高的,不用換位置
*/ }
for(i=0; iint main(void)
; int i = 8; // 儲存陣列最大下標
int data = 0; //要插進來的數
scanf("%d",&data);
while((i>=0) && (a[i]>data)) // 找到data應插入的位置,並把該位置空出來
a[i+1] = data; // data插入該位置
for(i=0; i<10; i++)
printf("\n");
return 0;
}
氣泡排序是從左往右比,插入排序是從右往左比,但也是一輪輪比較
原序列中,從左邊第二個開始,每一輪比較乙個數,每個數以此與左邊所有數比較
左邊都是以排好的數列,該數與排好的數列逐個比較,最後插入,形成新有序數列。
此程式是手動指定了陣列長度為10,為何?陣列定長,若寫成 int a = ;
系統自動初始化陣列長度為9,你就無法擴充套件陣列a了,陣列的最後乙個元素將會向後覆蓋乙個int型未分配給它的記憶體空間。
綜上,程式猿需要手動維護陣列的長度,若可以動態擴充套件長度的話,
那麼就可定義成 int a = ; 這種形式。
可以通過 sizeof(a) / sizeof(a[0]) 獲取陣列中有意義的資料的長度,然後減一就是陣列最大下標。
若需要插入就動態擴充套件乙個int型空間即可。
動態陣列和鍊錶將會解決這個缺陷。
氣泡排序
選擇排序
插入排序
快速排序
C語言實現插入排序
插入排序 我在學習一些簡單的演算法,我用文字記錄我的進步。插入排序 其實就是在待排序列中找到,沒有排序好的元素,插入的適當的位置,本文以公升序為例,簡單的講解一下。直接看下面的 include stdio.h include stdlib.h include string.h void swap i...
C語言實現插入排序
插入排序是排序演算法的一種,它不改變原有的序列 陣列 而是建立乙個新的序列,在新序列上進行操作。這裡以從小到大排序為例進行講解。插入排序的基本思想是,將元素逐個新增到已經排序好的陣列中去,同時要求,插入的元素必須在正確的位置,這樣原來排序好的陣列是仍然有序的。在實際使用中,通常是排序整個無序陣列,所...
插入排序(C 語言實現)
插入排序分為直接插入排序和折半插入排序,直接插入排序利用遍歷的方式查詢插入位置,時間複雜度為n 2,直接插入法由於不會改變相同元素的相對順序,所以直接插入排序是一種穩定的排序演算法。折半插入排序 二分插入排序 折半插入利用二分法查詢插入位置,只是減少了查詢比較的操作,所以其時間複雜度仍為n 2,二分...