qsort函数与sort函数

qsort函数

qsort函数是基于快速排序的方法。
void qsort(void *base,size_t num,size_t width,int (_cdecl *compare)int compare(const void *a,const void *b))

第一个参数,base是需要排序的目标数组名。
第二个参数,num是参与排序数目个数
第三个参数,width是单个元素大小,推荐使用sizeof(s[0])这样的格式。
第四个参数,compare就是比较函数

首先compare一般定义为int compare(const void *a,const void *b)
升序 a>b return 1;a

int a[10] = { 10,9,8,7,6,5,4,3,2,1 };

int compare(const void *a, const void *b) {
    int *p1, *p2;
    p1 = (int *)a; p2 = (int *)b;
    if (*p1 > *p2)
        return 1;
    else if (*p1 < *p2)
        return -1;
    else
        return 0;
}

int main() {
    qsort(a, 10, sizeof(a[0]),compare);

    for (int i = 0; i < 10;i++) {
        cout << a[i] << "--";
    }
    return 0;
}

我的理解,这里a和b实际上是指向数组里面元素的指针,,使用强制转换之后(int *),将地址赋值给p1和p2,而p1和p2就是地址。这里为什么要重新定义地址呢,是因为compare函数里面,a和b是void类型的。所以不能够直接使用。

  • 对char类型数组排序
char a[10] = { 'b','d','c','f','e','g','i','h','z','k' };

int compare(const void *a, const void *b) {
    char *p1, *p2;
    p1 = (char *)a;
    p2 = (char *)b;
    if (*p1 > *p2)
        return 1;
    else if (*p1 < *p2)
        return -1;
    else
        return 0;
}

int main() {
    qsort(a, 10, sizeof(a[0]),compare);

    for (int i = 0; i < 10;i++) {
        cout << a[i] << "--";
    }
    return 0;
}

qsort函数与sort函数_第1张图片
- 对double类型数组排序

double a[10] = { 9,8,7,6,5,4,3,2,1,10 };

int compare(const void *a, const void *b) {
    double *p1, *p2;
    p1 = (double*)a;
    p2 = (double*)b;

    if (*p1 > *p2)
        return 1;
    else if (*p1 < *p2)
        return -1;
    else
        return 0;
}

int main() {
    qsort(a, 10, sizeof(a[0]),compare);

    for (int i = 0; i < 10;i++) {
        cout << a[i] << "--";
    }
    return 0;
}

qsort函数与sort函数_第2张图片
- 对结构体一级排序

class A{
private:
public:
    double data1;
    int data2;
    void print() {
        cout << data1 << "--" << data2 << endl;
    }
};

int compare(const void *a, const void *b) {
    A *p1, *p2;
    p1 = (A*)a;
    p2 = (A*)b;

    if ((*p1).data1 > (*p2).data1)
        return 1;
    else if ((*p1).data1 < (*p2).data1)
        return -1;
    else
        return 0;
}

int main() {
    A a[10];
    for (int i = 0; i < 10;i++) {
        a[i].data1 = 10-i; a[i].data2 = i;
    }
    qsort(a, 10, sizeof(a[0]),compare);

    for (int i = 0; i < 10;i++) {
        a[i].print();
    }
    return 0;
}

qsort函数与sort函数_第3张图片

  • 对结构体二级排序
class A{
private:
public:
    double data1;
    int data2;
    void print() {
        cout << data1 << "--" << data2 << endl;
    }
};

int compare(const void *a, const void *b) {
    A *p1, *p2;
    p1 = (A*)a;
    p2 = (A*)b;

    if ((*p1).data2 > (*p2).data2)
        return 1;
    else if ((*p1).data2 < (*p2).data2)
        return -1;
    else
        return 0;
}

int main() {
    A a[10];
    for (int i = 0; i < 10;i++) {
        a[i].data1 = 10-i; a[i].data2 = 10-i;
    }
    qsort(a, 10, sizeof(a[0]),compare);

    for (int i = 0; i < 10;i++) {
        a[i].print();
    }
    return 0;
}

qsort函数与sort函数_第4张图片

  1. 第二种compare写法
int compare(const void *a, const void *b) {
    A *p1, *p2;
    p1 = (A*)a;
    p2 = (A*)b;

    if (p1->data2 > p2->data2)
        return 1;
    else if (p1->data2 < p2->data2)
        return -1;
    else
        return 0;
}
  1. 第三种compare写法
int compare(const void *a, const void *b) {
    A p1,p2;
    p1 = (A*)a;
    p2 = (A*)b;

    if (p1.data2 > p2.data2)
        return 1;
    else if (p1.data2 < p2.data2)
        return -1;
    else
        return 0;
}

qsort函数与sort函数_第5张图片

因为,p1是一个对象,而在程序里面,a是一个指针,两者不是同一类型。

sort函数

class myclass{
private:
public:
    int first; int second;
    myclass(int a,int b):first(a),second(b){}
    bool operator<(const myclass &m) {
        return first < m.first;
    }
    void print() {
        cout << first << "--" << second << endl;
    }
};

bool less_second(const myclass & i1, const myclass & i2) {
    return i1.second >i2.second;
}

int main() {
    vector<myclass>data;
    for (int i = 0; i < 10;i++) {
        myclass my(10 - i, i * 3);
        data.push_back(my);
    }
    cout << "original" << endl;
    for (int i = 0; i < data.size();i++) {
        data[i].print();
    }
    cout << "sorted by first" << endl;
    sort(data.begin(), data.end());
    for (int i = 0; i < data.size(); i++) {
        data[i].print();
    }
    cout << "sorted by second" << endl;
    sort(data.begin(), data.end(),less_second);
    for (int i = 0; i < data.size(); i++) {
        data[i].print();
    }
}

qsort函数与sort函数_第6张图片

qsort函数与sort函数_第7张图片

总结:
只需要在最后写一个bool cmp的比较函数即可。
这之前在leetcode已经做了很多,不再赘述
我记得在一道leetcode题目里面对一个函数做排序的时候是需要先写一个类的。待会儿把她找出来。

总结在qsort函数中a>b return 1的时候是升序
在sort函数中 return a>b 是降序

你可能感兴趣的:(排序)