c語言 qsort排序
阿新 • • 發佈:2021-01-27
技術標籤: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;
}