【发布时间】:2018-01-18 20:02:06
【问题描述】:
使用这个简单的示例,目前有 6 个数字排序为 5、4、3、2、1、0,并将排序为:0、1、2、3、4、5
#include <stdio.h>
#include <stdlib.h>
int values[] = {5,4,3,2,1,0};
int sizeOfArray = sizeof(values)/sizeof(int);
int cmpfunc (const void * a, const void * b)
{
printf("Comparing %d and %d \n",*(int*)a, *(int*)b);
return ( *(int*)a - *(int*)b );
}
int main () {
int n;
printf("Size of Array : %d\n", sizeOfArray);
printf("Before sorting the list is: \n");
for( n = 0 ; n < sizeOfArray; n++ ) {
printf("%d ", values[n]);
}
printf("\n");
qsort(values, sizeOfArray, sizeof(int), cmpfunc);
printf("\nAfter sorting the list is: \n");
for( n = 0 ; n < sizeOfArray; n++ ) {
printf("%d ", values[n]);
}
return(0);
}
在 cmpfunc 函数中添加了一个 printf 命令,用于在调用每个函数时显示正在比较的数字。
Size of Array : 6
Before sorting the list is:
5 4 3 2 1 0
Comparing 4 and 3
Comparing 5 and 3
Comparing 5 and 4
Comparing 1 and 0
Comparing 2 and 0
Comparing 2 and 1
Comparing 3 and 0
Comparing 3 and 1
Comparing 3 and 2
After sorting the list is:
0 1 2 3 4 5
请注意,应用程序只调用 cmpfunc 9 次。 我本来希望这个函数被多次调用。 另请注意,5 或 4 永远不会与 2 或 1 进行比较。
有没有人能够解释导致这个例程如此高效的幕后发生的事情?
【问题讨论】:
-
了解快速排序算法的工作原理。 我本来期望... - 如果你有一些期望,你应该证明它们是合理的。
-
只是谷歌快速排序
-
"另外请注意,5 或 4 永远不会与 2 或 1 进行比较。"但是 5 与 4 进行比较,4 与 3 进行比较,3 与 2 和 1 进行比较。排序满足transitivity,因此这些比较提供了足够的信息来知道
5 > 1(例如)。跨度> -
请注意,
qsort()未指定使用快速排序算法。