您好,登錄后才能下訂單哦!
今天小編給大家分享一下c語言插入法排序怎么實現的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
插入法排序較為復雜,其基本工作原理是抽出一個數據,在前面的數據中尋找相應的位置插入,直到完成排序。以數字9、6、15、4、2為例,采用插入法實現數字按從小到大進行排序,插入法排序過程如圖8.23所示。
圖8.23 插入法排序過程示意圖
從圖8.23可以發現,在第一次排序過程中將第一個數取出來,并放置在第一個位置;然后取出第二個數,并將第二個數與第一個數進行比較,如果第二個數小于第一個數,則將第二個數排在第一個數之前,否則將第二個數排在第一個數之后;然后取出下一個數,先與排在后面的數字進行比較,如果當前數字比較大則排在最后,如果當前數字比較小,還要與之前的數字進行比較,如果當前數字比前面的數字小,則將當前數字排在比它小的數字和比它大的數字之間,如果沒有比當前數字小的數字,則將當前數字排在最前方;依此類推,不斷取出未進行排序的數字與排序好的數字進行比較,并插入到相應的位置,直到將一組數字按從小到大排序為止。
下面通過實例來看一下如何通過程序使用插入法實現數組元素從小到大的排序。
利用插入排序法,從少到多輸出顯示老年人的數量
政府福利,根據老年人數發放養老補助。在本實例中,聲明了一個整型數組和兩個整型變量,其中整型數組用于存儲用戶輸入的數字,而兩個整型變量分別作為兩個元素交換時的中間變量和記錄數組元素位置,然后通過雙層循環進行插入法排序,最后將排好序的數組進行輸出。具體代碼如下:
01 #include<stdio.h>/*包含頭文件*/ 02 int main() /*主函數main*/ 03 { 04 int i; /*定義變量*/ 05 int a[10]; 06 intiTemp; 07 intiPos; 08 printf("輸入老人數:\n"); /*提示信息*/ 09 for(i=0;i<10;i++) /*輸入老人數據*/ 10 { 11 printf("a[%d]=",i); 12 scanf("%d", &a[i]); 13 } 14 15 /*從小到大排序*/ 16 for(i=1;i<10;i++) /*循環數組中元素*/ 17 { 18 iTemp = a[i]; /*設置插入值*/ 19 iPos = i-1; 20 while((iPos>=0) && (iTemp<a[iPos])) /*尋找插入值的位置*/ 21 { 22 a[iPos+1] = a[iPos]; /*插入數值*/ 23 iPos--; 24 } 25 a[iPos+1] = iTemp; 26 } 27 28 /*輸出數組*/ 29 for(i=0;i<10;i++) 30 { 31 printf("%d\t",a[i]); /*輸出制表位*/ 32 if(i == 4) /*如果是第5個元素*/ 33 printf("\n"); /*輸出換行*/ 34 } 35 printf("\n"); 36 37 return 0; /*程序結束*/ 38 }
運行程序,顯示結果如圖8.24所示。
圖8.24 插入法排序運行圖
從該實例代碼和運行結果可以看出:
(1)聲明一個整型數組a,并通過鍵盤為數組元素賦值。
(2)設置一個嵌套循環,第一層循環為后9個數組元素,將第二個元素賦值給中間變量,并記錄前一個數組元素的下標位置。在第二層循環中,首先要判斷是否符合循環的條件,允許循環的條件是記錄的下標位置必須大于等于第一個數組元素的下標位置,并且中間變量的值小于之前設置下標位置的數組元素,如果滿足循環條件,則將設置下標位置的數組元素值賦值給當前的數組元素。
(3)然后將記錄的數組元素下標位置向前移動一位,繼續進行循環判斷。內層循環結束以后,將中間變量中保存的數值賦值給當前記錄的下標位置之后的數組元素,繼續進行外層循環,將數組中下一個數組元素賦值給中間變量,再通過內層循環進行排序。
(4)依此類推,直到循環結束,這時就將數組元素按照從小到大的順序重新排列了。
(5)循環輸出數組中的元素,并在輸出5個元素后進行換行,在下一行輸出后面的5個元素。
以上就是“c語言插入法排序怎么實現”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。