在软件编码中常常遇到这样一个场景,对一个数组按照某种规则进行排序,在这种规则下排序后,如果其中的某些元素满足另一种规则,则按照另一种规则进行二次排序,这时可以利用快排算法来实现该种需求。
例如:
现有某代码仓,其中有多种编程语言(languageId,从0-6分别代码C、C++、Java等),每种语言都有若干代码量(codeline),现要求编写代码,按如下规则输出语言和代码量:按代码量从多到少排序输出,若代码量相同,则按编程语言Id由小到大输出。
代码实现如下:以结构体表征语言和代码量关系,并用结构体数组存储数据,最后用qsort进行排序。
#include <stdlib.h>
typedef struct {
int languageId;
int codeline;
} codeSum;
int cmp(const void *a, const void *b) {
codeSum *codeA = (codeSum *)a;
codeSum *codeB = (codeSum *)b;
if (codeA->codeline == codeB->codeline) {
return codeA->languageId > codeB->languageId;
}
return codeA->codeline < codeB->codeline;
}
int main()
{
codeSum sum[6] = {0};
sum[0].languageId = 3;
sum[0].codeline = 6000;
sum[1].languageId = 0;
sum[1].codeline = 4000;
sum[2].languageId = 1;
sum[2].codeline = 5000;
sum[3].languageId = 2;
sum[3].codeline = 6000;
sum[4].languageId = 4;
sum[4].codeline = 6000;
sum[5].languageId = 5;
sum[5].codeline = 9000;
qsort(sum, 6, sizeof(codeSum), cmp);
for (int i = 0; i < 6; i++) {
printf("sum[%d].languageId = %d, sum[%d].codeline = %d \n", i, sum[i].languageId, i, sum[i].codeline);
}
return(0);
}
代码运行结果如下:
sum[0].languageId = 5, sum[0].codeline = 9000 sum[1].languageId = 2, sum[1].codeline = 6000 sum[2].languageId = 3, sum[2].codeline = 6000 sum[3].languageId = 4, sum[3].codeline = 6000 sum[4].languageId = 1, sum[4].codeline = 5000 sum[5].languageId = 0, sum[5].codeline = 4000