[Wiki] Merge Sort in C

####Hôm nay rảnh rỗi, viết hàm merge_sort chơi

  • Cách Dùng: Tương tự hàm qsort trong thư viện stdlib.h
merge_sort(mảng, số lượng phần tử, kích thước 1 phần tử, hàm so sánh);
  • độ phức tạp:
  • trung bình: O(nlogn)
  • xấu nhất: O(nlogn)
  • bộ nhớ: O(n)
  • source code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <time.h>

#define __sort
#define type void*
typedef int (*_sort_cmp_fn_t)(const type,const type);
#define A(i) ((a)+(i)*(size))
inline void merge_sort(type a,const int n,int size,_sort_cmp_fn_t cmp){
    if(n<2){
        return;
    }
    type newa=malloc(n*size);
    assert(newa!=NULL);
    int mid=n/2;
    merge_sort(a,mid,size,cmp);
    merge_sort(A(mid),n-mid,size,cmp);
    register int i=0,j=mid,out=0;
    while(out<n){
        if(i<mid){
            if(j<n){
                if(cmp(A(i),A(j))<=0){
                    memcpy(newa+out*size,A(i),size);
                    i++;
                }else{
                    memcpy(newa+out*size,A(j),size);
                    j++;
                }
            }else{
                memcpy(newa+out*size,A(i),size);
                i++;
            }
        }else{
            memcpy(newa+out*size,A(j),size);
            j++;
        }
        out++;
    }
    memcpy(a,newa,size*n);
    free(newa);
}
#undef A
#undef type
#undef __sort

typedef struct{
    char name[20];
    int level;
} user;
void show(user *a,int n){
    int i;
    for(i=0;i<n;++i){
        printf("%d %s\n",a[i].level,a[i].name);
    }
}
int cmp(const void *a,const void *b){
    const user *x=a,*y=b;
    if(x->level!=y->level) return x->level-y->level;
    return strcmp(x->name,y->name);
}
int main(){
    user a[]={
        {"gio",2},
        {"ltd",3},
        {"honey_moon",2},
        {"nhim_xu",3}
    };
    int s=sizeof(user);
    int n=sizeof(a)/s;
    int i;
    merge_sort(a,n,s,cmp);
    show(a,n);
    return 0;
}
output
2 gio
2 honey_moon
3 ltd
3 nhim_xu
2 Likes

Mời ae cùng ngâm cứu :grin:

4 Likes

video của bạn rất thú vị :smile:

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?