c語言歸併排序

百度百科是這麼描述歸併排序的: 

歸併操作(merge),也叫歸併算法,指的是將兩個已經排序的序列合併成一個序列的操作。

 

  如 設有數列{6,202,100,301,38,8,1}

 

  初始狀態: [6] [202] [100] [301] [38] [8] [1] 比較次數

 

  i=1 [6 202 ] [ 100 301] [ 8 38] [ 1 ] 3

 

  i=2 [ 6 100 202 301 ] [ 1 8 38 ] 4

 

  i=3 [ 1 6 8 38 100 202 301 ] 4

 

  總計: 11次

不知道我下面這個算不算歸併排序

 

  1. #include <stdio.h> 
  2. void printArr(int arr[],int length){ 
  3.         int i; 
  4.         for(i=0;i<length;i++){ 
  5.                 printf("%d,",arr[i]); 
  6.         } 
  7.         printf("\n"); 
  8. void merge(int a[],int alength,int b[],int blength,int c[]){//將2個已排好序的數組合併到數組c 
  9.         int i=0,j=0,k=0; 
  10.         while(1){ 
  11.                 if(a[i]<=b[j]){ 
  12.                         c[k] = a[i]; 
  13.                         i++; 
  14.                         k++; 
  15.                         if(i==alength){ 
  16.                                 for(;j<blength;j++,k++){ 
  17.                                         c[k] = b[j]; 
  18.                                 } 
  19.                                 break
  20.                         } 
  21.                 }else
  22.                         c[k] = b[j]; 
  23.                         j++; 
  24.                         k++; 
  25.                         if(j==blength){ 
  26.                                 for(;i<alength;i++,k++){ 
  27.                                         c[k] = a[i]; 
  28.                                 } 
  29.                                 break
  30.                         } 
  31.                 } 
  32.         } 
  33.         printArr(c,k); 
  34.  
  35. void mergeSort(int arr[],int length){//將一個數組分成2個數組,前length-1爲第一個,最後一個爲第二個,然後合併2個數組 
  36.         if(length > 1){ 
  37.                 int arr1[length-1],arr2[1] = {arr[length-1]}; 
  38.                 int i; 
  39.                 for(i=0;i<length-1;i++){ 
  40.                         arr1[i] = arr[i]; 
  41.                 } 
  42.                 mergeSort(arr1,length-1);//遞歸的調用自己 
  43.                 merge(arr1,length-1,arr2,1,arr); 
  44.         } 
  45.  
  46. int main(void){ 
  47.         int a[10] = {3,54,16,8,123,8,89,23,87,2}; 
  48.         printArr(a,10); 
  49.         mergeSort(a,10); 
  50.         return 0; 
  51.  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章