C语言 使用函数和指针进行冒泡排序



我有这个函数代码冒泡排序数组使用指针。
然而,我不理解第二个for循环(内部的那个):
为什么他们做p < a + n - i - 1?

void bubble_sort(int* a, int n) {
for (int i = 0; i < n; i++) {
for (int* p = a; p < a + n - i - 1; p++) { // bubble
if (*p > *(p+1)) {
int t = *p;
*p = *(p+1);
*(p+1) = t;
}
}
}
}

p < a + n - i - 1

用于将数组的编辑部分绑定到数组的未排序子数组。最后的i元素不被编辑,因为这些槽将由数组中按顺序排列的i最大的元素组成;因此,没有必要检查它们,避免这样做,以防止函数浪费时间。

1被删除是为了防止访问数组已排序部分以外的元素,当I>当I = 0时,通过

一行阻止访问数组外的内存。
if (*p > *(p+1)) {

如果1没有被减去,当p + 1被取消引用时,这将有发生SegFault的风险。

因为您在下一行比较pp+1:

if (*p > *(p+1)) {

所以如果你有n个元素,a+n点在最后一个元素之后。a+n-i指向子数组中最后一个元素之后,但是在这种情况下,您将比较子数组中最后一个元素与最后一个元素之后的元素。因此,必须在最后一个元素之前停止:a+n-i-1

0                        n-i     n
array: [a-------------------------|------]
last inner:           p=a+n-i-1->||<-p+1

最新更新