程序设计课上的qsort应用
记录一下C语言的qsort库函数调用
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define TEST_SIZE 10
#define STRING_LEN 20
需要的一些预编译&宏定义
qsort()
在<stdlib.h>
中
int compare_int(const void *a, const void *b)
{
return *(int *)a - *(int *)b;//返回值只分正负,不用在意具体数字
}
void sort_intarr()
{
int arr[TEST_SIZE], i;
srand(1);
printf("sort_intarr before:\n");
for (i = 0; i < TEST_SIZE; i++)
printf("%d%c", arr[i] = rand(), i == TEST_SIZE - 1 ? '\n' : ' ');//这是个绝妙的运算符,如果到结尾就打印换行符,否则是空格
qsort((void*)arr, TEST_SIZE, sizeof(int), compare_int);//这是调用函数,所以不用写compare_int的参数,而且在IDE可以看到qsort的参数类型,不用自己干想
printf("sort_intarr after:\n");
for (i = 0; i < TEST_SIZE; i++)
printf("%d%c", arr[i], i == TEST_SIZE - 1 ? '\n' : ' ');
}
int compare_float(const void *a, const void *b)
{
return *(float *)a - *(float *)b;
}
void sort_floatarr()
{
float arr[TEST_SIZE];
int i;
srand(2);
printf("sort_floatarr before:\n");
for (i = 0; i < TEST_SIZE; i++)
printf("%f%c", arr[i] = rand() / 100.0, i == TEST_SIZE - 1 ? '\n' : ' ');
qsort((void*)arr, TEST_SIZE, sizeof(float), compare_float);
printf("sort_floatarr after:\n");
for (i = 0; i < TEST_SIZE; i++)
printf("%f%c", arr[i], i == TEST_SIZE - 1 ? '\n' : ' ');
}
char rand_char()
{
char arr[2] = { 'A', 'a' };
return arr[rand() % 2] + rand() % 26;
}
int compare_char(const void *a, const void *b)
{
return *(char *)a - *(char *)b;//这样会导致大小写字母排序,大写永远在前面
}
void sort_chararr()
{
char arr[TEST_SIZE];
int i;
srand(3);
printf("sort_chararr before:\n");
for (i = 0; i < TEST_SIZE; i++)
printf("%c%c", arr[i] = rand_char(), i == TEST_SIZE - 1 ? '\n' : ' ');
qsort((void*)arr, TEST_SIZE, sizeof(char), compare_char);
printf("sort_chararr after:\n");
for (i = 0; i < TEST_SIZE; i++)
printf("%c%c", arr[i], i == TEST_SIZE - 1 ? '\n' : ' ');
}
int compare_string(const void *a, const void *b)
{
return strcmp((char *)a, (char *)b);//char*是字符串排序
}
void sort_stringarr()
{
char stringarr[TEST_SIZE][STRING_LEN];//此处创建了一个数组,因此排序的对象是二维数组
int i, j;
srand(4);
printf("sort_stringarr before:\n");
for (i = 0; i < TEST_SIZE; i++)
{
int rand_len = 3 + rand() % (STRING_LEN - 2);
for (j = 0; j < rand_len - 1; j++)
stringarr[i][j] = rand_char();
stringarr[i][rand_len - 1] = '\0';
printf("%s\n", stringarr[i]);
qsort((void *)stringarr[i], rand_len - 1, sizeof(char), compare_char);//-1是为了不把\0加入到排序过程中
}
qsort(stringarr, TEST_SIZE, sizeof(char)*STRING_LEN, compare_string);//排序对象长度字节数,对数组类型排序时
printf("sort_stringarr after:\n");
for (i = 0; i < TEST_SIZE; i++)
printf("%s\n", stringarr[i]);
}
int main(void)
{
void sort_intarr();
void sort_floatarr();
void sort_chararr();
void sort_stringarr();
sort_intarr();
sort_floatarr();
sort_chararr();
sort_stringarr();
system("pause");
return 0;
}