這節我們介紹直接插入排序和希爾排序演算法,
一、直接插入排序
直接插入排序(direct insert sort)的基本思想是:順序地將待排序的記錄按其關鍵碼的大小插入到已排序的記錄子串行的適當位置。 子串行的記錄個數從1開始逐漸增大,當子串行的記錄個數與順序表中的記錄個數相同時排序完畢。
設待排序的順序表 sqlist 中有 n 個記錄,初始時子串行中只有乙個記錄sqlist[0]。第一次排序時,準備把記錄 sqlist[1]插入到已排好序的子串行中,這時只需要比較 sqlist[0]和 sqlist[1]的大小,若 sqlist[0]≤sqlist[1],說明序列已有序,否則將 sqlist[1]插入到 sqlist[0]的前面,這樣子序列的大小增大為 2。第二次排序時,準備把記錄 sqlist[2]插入到已排好序的子串行中,這需要先比較 sqlist[2] 和 sqlist[1]以確定是否需要把 sqlist[2]插入到sqlist[1]之前。如果 sqlist[2]插入到 sqlist[1]之前,再比較 sqlist[2]和sqlist[0]以確定是否需要把 sqlist[2]插入到 sqlist[0]之前。 這樣的過程一直進行到 sqlist[n-1]插入到子串行中為止。這時,順序表 sqlist 就是有序的。如圖所示:
直接插入排序的演算法如下所示,演算法中記錄的比較表示記錄關鍵碼的比較,順序表中只存放了記錄的關鍵碼:相應源**如下:
//(1) 最好的情況是順序表中的記錄已全部排好序。這時外層迴圈的次數為n-1,內層迴圈的次數為 0。這樣,外層迴圈中每次記錄的比較次數為 1,所以直接插入排序演算法在最好情況下的時間複雜度為 o(n)。排序的插入排序的演算法
public
void insertsort(seqlistsqlist)
//進行賦值
sqlist[j + 1] =tmp; }}
}//雙層迴圈,時間的複雜度是o(n2)
(2) 最壞情況是順序表中記錄是反序的。這時內層迴圈的迴圈係數每次均為 i。因此,直接插入排序演算法在最壞情況下的時間複雜度為o(n2)。
(3) 如果順序表中的記錄的排列是隨機的,則記錄的期望比較次數為n2/4。因此,直接插入排序演算法在一般情況下的時間複雜度為o(n2)。 可以證明,順序表中的記錄越接近於有序,直接插入排序演算法的時間效率越高,其時間效率在o(n)到o(n2)之間。
直接插入排序演算法的空間複雜度為 o(1)。因此,直接插入排序演算法是一種穩定的排序演算法。什麼是穩定的排序演算法,就是前面與後面的數字相等的話,不用交換。
二、希爾排序
希爾排序又叫縮小增量法,屬於插入類排序,是將整個無序列分割成若干小的子串行分別進行插入排序。排序過程:先取乙個正整數d1
相應的源**如下:
///由於是三層迴圈,時間複雜度是o(n3);這是乙個不穩定的排序。///shell sort
/// ///
///public
static
void shellsort(t array) where
t : icomparable}}
}}}//演算法的時間複雜度是o(n2)
這節,我們介紹了直接插入排序和希爾排序。下節我們介紹,基數排序 ,簡單選擇排序 ,堆排序。
資料結構與演算法 揭秘
字面意思就是研究資料的一種方法,就是研究資料在程式中組織的一種方法。資料結構就是,元素與元素有一種或者多種關係的集合,在軟體界有一種比較普片的公式就是程式 資料結構 演算法。1 集合 set 和數學的集合一樣,具有唯一性,確定性,無序性。2 線性結構 典型的資料庫二維表,一對一的關係。3 樹形結構 ...
C 資料結構與演算法揭秘一
這裡,我們 來說一說c 的資料結構了。什麼是資料結構。資料結構,字面意思就是研究資料的方法,就是研究資料如何在程式中組織的一種方法。資料結構就是相互之間存在一種或多種特定關係的資料元素的集合。程式界有一點很經典的話,程式設計 資料結構 演算法。用源 來體現,資料結構,就是程式設計。他有哪些具體的關係...
C 資料結構與演算法揭秘13
這節,我們來看看一下什麼了,來看看圖的遍歷吧!首先,搞清楚,圖的遍歷的基本的含義了。圖的遍歷是指從圖中的某個頂點出發,按照某種順序訪問圖中的每個頂點,使每個頂點被訪問一次且僅一次。圖的遍歷與樹的遍歷操作功能相似。圖的遍歷是圖的一種基本操作,並且圖的許多其他操作都是建立在遍歷操作的基礎之上的。遍歷示意...