快速排序函数

功 能: 快速排序
头文件:stdlib.h
用 法: void qsort(void *base,int nelem,int width,int (*fcmp)(const void *,const void *));
参数: 
1 待排序数组首元素的地址 
2 数组中待排序元素数量
3 各元素的占用空间大小
4 指向函数的指针,用于确定排序的顺序

 注意:数组中可以存储数字,字符,或者结构体都行。

1.普通数组:

#include 
#include 

int cmpInc(const void *a, const void *b)//递增
{
    return *(int *)a - *(int *)b;
}

int cmpDec(const void *a, const void *b)//递减
{
    return *(int *)b - *(int *)a;
}


int main()
{
    int a[5] = { 5 ,4 ,3,4,10};
    int i;

    printf("递减排序结果:\n");
    qsort(a, 5, sizeof(a[0]), cmpDec);
    for (i = 0; i < 5; i++)
    {
        printf("%d ", a[i]);
    }
    printf("\n");

    return 0;
}

2.字符串长度排序(这里是先比较第一个,然后第二个。。。。):

#include 
#include 
#include 
#define M 12
#define N 20

int cmpInc(const void *a, const void *b)
{
    return strlen((char *)a) - strlen((char*)b);//字符串长度递增
}

int cmpDec(const void *a, const void *b)
{
    return strlen((char *)b) - strlen((char*)a);//字符串长度递减
}

int main(void)
{
    int i;
    char s[M][N] =
    {
        "1",
        "12",
        "123",
        "1234",
        "1",
        "2",
        "3",
        "4",
        "5",
        "6",
        "7",
        "8"
    };

    qsort(s, M, sizeof(char) * N, cmpInc);//递增
    for (i = 0; i < M; i++)
        printf("%s\n", s[i]);

    printf("\n");

    qsort(s, M, sizeof(char) * N, cmpDec);//递减
    for (i = 0; i < M; i++)
        printf("%s\n", s[i]);

    return 0;
}

字符串大小排序:

#include 
#include 
#include 
#define M 12
#define N 20


int cmpinc(const void *a, const void *b)//递增
{
    return *(char *)a - *(char*)b;//字符串大小比较
}

int cmpdec(const void *a, const void *b)//递减
{
    return *(char *)b - *(char*)a;
}

int main(void)
{
    int i;
    char s[M][N] =
    {
        "1",
        "12",
        "123",
        "1234",
        "1",
        "2",
        "3",
        "4",
        "5",
        "6",
        "7",
        "8"
    };

    qsort(s, M, sizeof(char) * N, cmpinc);//递增
    for (i = 0; i < M; i++)
        printf("%s\n", s[i]);

    printf("\n");

    qsort(s, M, sizeof(char) * N, cmpdec);//递减
    for (i = 0; i < M; i++)
        printf("%s\n", s[i]);

    return 0;
}

结构体:

#include 
#include 
#define N 6

typedef struct
{
    char name[15];
    int  score;

}Student;

int compare1(const void *a, const void *b)
{
    return ((Student*)a)->score - ((Student*)b)->score;//以结构体的成绩排序
}

int compare2(const void *a, const void *b)
{
    return *(((Student*)a)->name) - *(((Student*)b)->name);//以结构体的学生姓名排序
}

void print(Student s)
{
    printf("%-15s : %d\n", s.name, s.score);
}

int main()
{
    Student s[N] =
    {
        "Zhang San", 94,
        "Li Si",     80,
        "You",       94,
        "I",        100,
        "He",        72,
        "She",       60
    };

    int i;
    qsort(s, N, sizeof(Student), compare1);
    for (i = 0; i < N; i++)
    {
        print(s[i]);
    }

    printf("\n");

    qsort(s, N, sizeof(Student), compare2);
    for (i = 0; i < N; i++)
    {
        print(s[i]);
    }

    return 0;
}

你可能感兴趣的:(算法基础--排序算法,模板,函数)