簡單插入排序算法代碼實現以及使用插入函數實現的思路


 1 #include<stdio.h>
 2 #define N 12
 3 //length統計數組的長度 返回最后元素的下標 
 4 int length(int a [N]){
 5     for(int i = 0;i<=N;i++){
 6         if(a[i]==0) return i-1;
 7         
 8     }    
 9 } 
10 //打印輸出數組元素
11 void show(int a[N]){
12     for(int i= 0;i<N;i++){
13         if(a[i]!=0) printf("%4d",a[i]);
14         
15     }
16     
17     
18 } 
19 //寫個插入算法,可以拿來測試用 
20 void insert(int a[N],int dex ,int value){
21     for(int i =length(a) ;i>=dex;i--){
22         a[i+1] = a[i];
23         
24     }
25     a[dex] = value ;
26 } 
27  //插入排序 
28 void insertsort(int a [N]){
29     int temp=0;
30     for(int i = 1;i<=length(a);i++){
31         for(int j = 0;j<i;j++){
32             if(a[j]>a[i]){ 
33             temp = a[j] ; 
34               a[j]=a[i]  ;    
35               a[i]=temp;} //與冒泡算法很相似 但思路上是有所區別的,很好的利用的i下標元素之前數組的有序性。     
36               //這里insert(a,j,a[i])函數是沒必要的,插入排序的操作實際上還是一個借助中間變量實現的算法,並不需要插入函數,假如一定要使用插入函數,還必須再寫一個刪除函數配套使用,太麻煩;            
37         }      //例如對3 2 1 4進行排序,使用insert函數第一輪結果是2 3 2 1 4 ;這里多出了一個2,必須使用刪除函數把它刪除,下一次循環才能得到正確的結果 
38         
39     }        
40 }
41
42 int main(void){ 43 int a [N] ={2,3,467,1,22,3,5,34,4,7} ;

//手動生成數組a printf("%d\n",length(a));

insertsort(a);

show(a); //輸出 1 2 3 3 4 5 7 22 34 467 結果正確 return 0 ;

 

//此算法的時間復雜度為O(n^2) 當插入的元素比較小,插入標記比較靠前時,temp = a[j] ;  a[j]=a[i]; a[i]=temp;這三條語句還是要反復執行很多次的。
//例如對3241進行插入排序,第一次i循環后的結果為2341,第二次循環不執行if語句,第三次循環的過程為1342 --> 1243 --> 1234,這個過程中,因為下標i元素離需要插入的j位置比較遠,所以
下標為i的元素反復與j循環中的元素進行交換,i循環中i與需要交換的j位置距離越遠,插入排序算法的執行次數就越接近冒泡算法。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM