44. 通过使用sqort函数对各种类型数据进行排序,熟悉sqort可控的对外接口,也就是sqort专用回调函数的实现。

//使用基于数组的qsort快速排序函数,实现对各种类型的数据进行排序
1.先了解qsort
1)qsort是基于数组的快速排序函数
2) void qsort (void* base, size_t num, size_t size, int (*compar)(const void*,const void*));//参数设计成void*的目的是使之范型化。
3) int (*compar)(const void*,const void*)//注意这两个参数是要比较的两个数组元素的地址,而非直接的数据。
4)需要根据qsort的 函数指针 参数的类型,来实现自己的回调函数
5)sqort 只对 compar 返回的正值感兴趣,也就是当返回正值才发生交换行为。
    2.qsort与其回调函数各分工的关系
       排序 == 比较+交换
       回调函数做的事是比较,qsort自己做的是交换。



实现对整型数组的排序
#include <stdio.h>
#include <stdlib.h>


int callBackCompare(const void* pa,const void* pb)//升序
{
#if 0
    if( *(int*)pa > *(int*)pb )//大于的时候交给sqort做交换
        return 1;
    else
        return -1;
#endif
    
#if 0    
    return *(int*)pa - *(int*)pb;
#endif
}

int main(void)
{
    int arr[10] = {6,5,4,3,2,1,7,8,9,0};

    qsort(arr,10,4,callBackCompare);
return 0;
}




实现对字符串的排序

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int callBackCompare(const void* pa,const void* pb)//升序
{

#if 0  //错误
    if(strcmp(*(char*)pa,*(char*)pb) > 0)
    {
        return 1;
    }
    else
    {
        return -1;
    }


#endif

#if 0  //错误  解引用后只取了一个字节空间的数据
    if(strcmp((char*)(*(char*)pa),(char*)(*(char*)pb)) > 0)
    {
        return 1;
    }
    else
    {
        return -1;
    }


#endif


#if 0  //正确
    if(strcmp(*(char**)pa,*(char**)pb) > 0)
    {
        return 1;
    }
    else
    {
        return -1;
    }


#endif

#if 0  //正确,犯贱用法 解引用后取了四个字节空间的数据
    if( strcmp( *(int*)pa, *(int*)pb ) > 0 )
    {
        return 1;
    }
    else
    {
        return -1;
    }


#endif

}



int main(void)
{
    int i;
    char* arr[4] = {"dOracle","cHuaWei","aMicroSoft","bApple"};
    qsort(arr,4,4,callBackCompare);

    for(i = 0;i<4;i++)
    {
        printf("%s\n",arr[i]);
    }

    return 0;
}

 

posted @ 2018-08-21 18:42  2018年8月10日注册  阅读(505)  评论(0编辑  收藏  举报