C語言例項解析精粹學習筆記 42(插入排序)

2022-08-28 23:15:25 字數 1208 閱讀 9429

例項說明:

將乙個整數陣列按從小到大的順序進行排序。(主要學習基本的插入排序和改進的氣泡排序的演算法和應用)

思路1:

從第乙個資料開始,分別比較其後的資料,若比它小,則將這兩個數的位置交換;從第乙個資料開始,直到最後。

1 #include 2 #include 3

#define max 10045

67intmain()822

23 printf("

please input the elements one by one:");

24 printf("\n"

);25

for(int i=0; i < totnumele; i++)

2629

30for(int i=0; i1; i++)

3140}41

}4243 printf("

the sequence after sort is :\n");

44for(int i=0; i)

4548

49 printf("\n"

);50

return0;

51 }

下面是原書中給出的示例:

採用直接插入排序

1. 基本思路:假設待排序的記錄存放在陣列r[1..n]中(r[0]不儲存待排序的原始資料)。初始時,r[1]自成乙個有序區,無須區為r[2..n]。從i=2起直至i=n為止,依次將r[i]插入當前的有序區r[i..i-1]中,生成含n個記錄的有序區。

插入排序與打撲克時整理手上的紙牌類似,第一張牌不需要整理,之後的逐張排序。

1

intr[max];23

void insert_sort(intn)4

while(r[0] 15 r[j+1] = r[0

];16}17

}18 }

以上為關鍵**

歸納注釋(原書內容):

哨兵的作用:演算法中引進的附加記錄r[0]稱監視哨或哨兵(sentinel)。哨兵有兩個作用:

1)進行查詢(插入位置)迴圈之前,它儲存了r[i]的副本,使不致於因記錄後移而丟失r[i]的內容;

2)它的主要作用是在迴圈中「監視」下標變數j是否越界。一旦越界(即j=0),因為r[0]和自己比較,迴圈判定條件不成立使得查詢迴圈結束,從而避免了在該迴圈內的每一次均要檢測j是否越界。

C語言例項解析精粹學習筆記 32

例項32 編制乙個包含姓名 位址 郵編和 的通訊錄輸入和輸出函式。思路解析 1 用結構體來完成姓名 位址 郵編和 的組合。2 結構體指標的使用。3 malloc的使用 4 scanf函式的返回值是正確輸入的變數個數 程式 如下 1 include 2 include 3 include 45 def...

C語言例項解析精粹學習筆記 26

例項26 阿拉伯數字轉換為羅馬數字,將乙個整數n 1 9999 轉換為羅馬數字,其中數字和羅馬數字的對應關係如下 原書中的開發環境很老,我也沒有花心思去研究。自己在codeblocks中進行開發的,所以程式與原書中的程式有很多地方不同,但是關鍵的一些程式還是採用原書中的 1 include 2 in...

C語言例項解析精粹學習筆記 43(希爾排序)

例項說明 用希爾排序方法對陣列進行排序。由於書中更關注的例項,對於原理來說有一定的解釋,但是對於第一次接觸的人來說可能略微有些簡略。自己在草稿紙上畫了好久,後來發現網上有好多很漂亮的原理圖。下面將原書中的程式附上 主函式裡的程式略有差異 1 include 2 include 3 4 define ...