1. 程式人生 > 其它 >c語言 qsort排序

c語言 qsort排序

技術標籤:c

參考原文點這裡

一、函式原型
在這裡插入圖片描述
其中第一個引數 void* base是傳入一個數組,size_t num為陣列整體大小,size_t size 為單個元素的大小,int (compar)(const void,const void*)是需要使用者去完成的一個比較函式

針對這個函式,在不同型別的陣列中需要用不同的處理方式,來保證陣列中的元素大小不會失真(例如在處理double型的陣列時就需要用不同的方式來進行)

比較函式有三個返回值,分別為 >0,<0,0

二、不同型別的資料

1.int型別資料

//qsort函式
#include <stdio.h>
#include
<stdlib.h>
//qsort函式實現int型排序 //qosrt函式的使用者得實現一個比較函式 int int_cmp(const void * p1, const void * p2) { return (*( int *)p1 - *(int *) p2); } int main() { int arr[] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 }; qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof(int), int_cmp); for (int i = 0; i < sizeof
(arr) / sizeof(arr[0]); i++) { printf("%d ", arr[i]); } printf("\n"); return 0; }

2.對char型別陣列排序

//qosrt函式實現char型排序
#include<stdio.h>
#include<stdlib.h>
int char_cmp(const void* str1, const void* str2)
{
    return *(char*)str1 - *(char*)str2;
}

int
main() { char str[] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 }; qsort(str, sizeof(str) / sizeof(str[0]), sizeof(char), char_cmp); for (int i = 0; i < sizeof(str) / sizeof(str[0]); ++i) { printf("%d ", str[i]); } return 0; }

3.對double型別陣列排序(需特別注意)

//qosrt函式實現double型排序
#include<stdio.h>
#include<stdlib.h>
int double_cmp(const void* arr1, const void* arr2)
{
    return *(double*)arr1 > *(double*)arr2 ? 1 : -1;
    //注意這裡是用比較大小的方法,來返回正負
}

int main()
{
    double arr[] = { 1.4, 3.9, 5.4, 5.2, 9, 2, 4, 6, 8, 0 };
    qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof(double), double_cmp);
    for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); ++i)
    {
        printf("%f ", arr[i]);
    }

    return 0;
}

4.對結構體一級排序

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

typedef struct Student
{
    int x;
    int y;
    //按照x從小到大排序,當x相等時按照y從大到小排序
}Student;

Student student[7];

int cmp(const void *a, const void *b)
{
    Student* pa1 = (Student*)a;
    Student* pa2 = (Student*)b;

    return (pa1->x) > (pa2->x) ? 1 : -1;
}

//展示一下對於結構體裡賦值的後的結果
void Display()
{
    for (int i = 0; i < 7; ++i)
    {
        printf("%d\n",student[i].x);
    }
}

int main()
{
    int arr[7] = { 1,3,5,2,6,9,7 };
    for (int i = 0; i < 7; ++i)
    {
        //將陣列arr中的元素賦值給結構體x中
        student[i].x = arr[i];
    }
    Display();
    qsort(student, 7, sizeof(Student), cmp);
    for (int i = 0; i < 7; ++i)
    {
        printf("%d", student[i].x);
    }

    return 0;
}

5.對結構體二級排序

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

typedef struct Student
{
    int x;
    int y;
    //按照x從小到大排序,當x相等時按照y從大到小排序
}Student;

Student student[7];

int cmp(const void *a, const void *b)
{
    Student* pa1 = (Student*)a;
    Student* pa2 = (Student*)b;

    if (pa1->x != pa2->x)
    {
        return (pa1->x) > (pa2->x) ? 1 : -1;
    }
    else
    {
        return (pa1->y) > (pa2->y) ? 1 : -1;
    }
}

//展示一下對於結構體裡賦值的後的結果
void Display()
{
    printf("x=");
    for (int i = 0; i < 7; ++i)
    {
        printf("%d", student[i].x);
    }
    printf("\n");
    printf("y=");
    for (int i = 0; i < 7; ++i)
    {
        printf("%d", student[i].y);
    }
    printf("\n");
}

int main()
{
    int arr[7] = { 1,3,5,2,6,9,7 };
    for (int i = 0; i < 7; ++i)
    {
        //將陣列arr中的元素賦值給結構體x中
        student[i].y = arr[i];
    }
    Display();
    printf("排序結構體中的y:\n");
    qsort(student, 7, sizeof(Student), cmp);
    for (int i = 0; i < 7; ++i)
    {
        printf("%d", student[i].y);
    }

    return 0;
}