百度百科是這麼描述歸併排序的: 算法
歸併操做(merge),也叫歸併算法,指的是將兩個已經排序的序列合併成一個序列的操做。數組
如 設有數列{6,202,100,301,38,8,1}ide
初始狀態: [6] [202] [100] [301] [38] [8] [1] 比較次數spa
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 ] 4string
總計: 11次it
不知道我下面這個算不算歸併排序io
- #include <stdio.h>
- void printArr(int arr[],int length){
- int i;
- for(i=0;i<length;i++){
- printf("%d,",arr[i]);
- }
- printf("\n");
- }
- void merge(int a[],int alength,int b[],int blength,int c[]){//將2個已排好序的數組合併到數組c
- int i=0,j=0,k=0;
- while(1){
- if(a[i]<=b[j]){
- c[k] = a[i];
- i++;
- k++;
- if(i==alength){
- for(;j<blength;j++,k++){
- c[k] = b[j];
- }
- break;
- }
- }else{
- c[k] = b[j];
- j++;
- k++;
- if(j==blength){
- for(;i<alength;i++,k++){
- c[k] = a[i];
- }
- break;
- }
- }
- }
- printArr(c,k);
- }
- void mergeSort(int arr[],int length){//將一個數組分紅2個數組,前length-1爲第一個,最後一個爲第二個,而後合併2個數組
- if(length > 1){
- int arr1[length-1],arr2[1] = {arr[length-1]};
- int i;
- for(i=0;i<length-1;i++){
- arr1[i] = arr[i];
- }
- mergeSort(arr1,length-1);//遞歸的調用本身
- merge(arr1,length-1,arr2,1,arr);
- }
- }
- int main(void){
- int a[10] = {3,54,16,8,123,8,89,23,87,2};
- printArr(a,10);
- mergeSort(a,10);
- return 0;
- }