先输出的是p,然后才p++,所以说输出的就是数组从下标0开始的。
不知道你这个问题是否已经解决, 如果还没有解决的话:考虑一个边界问题,为什么移动i
和j
指针的条件是q[i] < x
和q[j] > x
,而不是q[i] <= x
和q[j] >= x
?
原因如下:
x
是数组里最大的数,序列中所有的数都满足q[i] <= x
,会导致i
会一直++
发生越界都不会停下来。x
是数组里最小的数,同理q[j] >= x
恒成立,j
会一直--
发生越界。这也是造成快排不稳定的原因,排序算法是否稳定,与时间效率是否稳定无关。稳定是指若源序列中两个值相同的数,排序后这两个数的先后次序不会发生改变。
而快排中当边界点存在重复的数会交换位置。因此快排不稳定。
解决不稳定的方法:把序列中的数改成二元数,Ai
改成 <Ai, i>
,从而使所有的数都不相同。
对于第24页的代码,需要先了解指针和数组的概念。
指针是一个变量,其值为另一个变量的地址。指针的声明方式为 *type name,其中,type为指针所指向的变量类型,name为指针的名称。
数组是一组相关类型的变量集合。数组的声明方式为 type name[size],其中,type为数组元素类型,name为数组名称,size为数组的大小。
现在我们来看一下参考资料中的代码:
int a[5]={1,2,3,4,5};
int *p=a;
printf("%d\n",*p++);
printf("%d\n",(*p)++);
printf("%d\n",*++p);
根据代码,我们可以执行以下步骤:
因此,输出结果为:
1
2
4
由此可见,输出结果不是因为++在打印后才执行了。而是因为指针在移动之后,对数组元素的访问发生了变化。在第二个输出语句中,执行(*p)++后,a[1]的值已经增加了1,所以第三个输出语句中,输出的是a[3]的值。