C語言 qsort函數及其實現

認識qsort函數

首先調用時先引頭文件#include<stdlib.h>
base是數組首元素,num是數組長度,width是數組中一個元素佔字節的大小,compare是一個比較函數,來確定比較的方式,若大於則返回正數,小於返回負數,相等返回0
在這裏插入圖片描述
在這裏插入圖片描述


關於cmp函數

由於根據聲明發現此處的e1,e2參數都是void*類型的指針,而此種類型的指針是不能解引用和++/–的,所以我們在比較時都要進行強制類型轉換

typedef struct Stu
{
   
   
    char name[20];
    int age;
    float score;
}STU;

int char_cmp(const void* e1,const void *e2){
   
   
    return strcmp((char *)e1, (char *)e2);//比較字符串大小
}
int float_cmp(const void*e1,const void *e2){
   
   
    return *((float *)e1) - *((float *)e2);//比較浮點型大小
}
int struct_cmp(const void*e1,const void *e2){
   
   
    return ((STU*)e1)->age - ((STU*)e2)->age;//比較結構體中age的大小
}
int int_cmp(const void *e1,const void *e2){
   
   
    return *((int *)e1) - *((int *)e2);//比較整型大小
}

特別注意,如要實現升降序
在這裏插入圖片描述

int int_cmp1(const void *e1,const void *e2){
   
   
    return *((int *)e1) - *((int *)e2);//升序
}
int int_cmp2(const void *e1,const void *e2){
   
   
    return *((int *)e2) - *((int *)e1);//降序
}

實現qsort函數(此處採取冒泡排序,後續補充快速排序)

void my_swap(char *e1,char *e2,int width){
   
   
    int i = 0;
    for (i = 0; i < width; i++){
   
   //因爲我們只能獲得j號元素的首地址,此處循環意義在於對於width個字節實現挨個交換
        char temp = *e1;
        *e1 = *e2;
        *e2 = temp;
        e1++;
        e2++;
        }
}

void my_qsort(void* base,size_t size,size_t width,int (*cmp)(const void* e1,const void *e2)){
   
   
    int i = 0, j = 0;
    for (i = 0; i < size - 1;i++){
   
   
        int flag=1;
        for (j = 0; j < size - 1 - i;j++){
   
   //此處仿照冒泡
            if(cmp((char *)base+j*width,(char *)base+(j+1)*width)>0){
   
   //(char *)的強制類型轉換爲了實現一個字節一個字節的加減,+j*width可以找到第j號元素的首地址
                my_swap((char *)base + j * width, (char *)base + (j + 1) * width, width);//此處實現交換
                flag=0;
            }
        }
        if(flag==1){
   
   
        break;
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章