对于指针实现冒泡排序,出现的问题,希望有old big brother能解释下,我该怎么改,错的原理在哪里

img

img


为什么通过指针方式实现的冒泡排序排序不出正确结果,有人能看出来哪里错了,顺便解释下,
感谢!

我个人还是觉得写一个冒泡没必要这么复杂。
如果你单纯要练习二级指针和数组,不建议你这么写,因为这里根本就用不上二级指针,为何要复杂化呢,容易把自己都给绕晕了。
1、用数组

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
 
#define ARR_LEN 255 /*数组长度上限*/
#define elemType int /*元素类型*/
 
/* 冒泡排序 */
/* 1. 从当前元素起,向后依次比较每一对相邻元素,若逆序则交换 */
/* 2. 对所有元素均重复以上步骤,直至最后一个元素 */
/* elemType arr[]: 排序目标数组; int len: 元素个数 */
void bubbleSort (elemType arr[], int len) {
    elemType temp;
    int i, j;
    for (i=0; i<len-1; i++) /* 外循环为排序趟数,len个数进行len-1趟 */
        for (j=0; j<len-1-i; j++) { /* 内循环为每趟比较的次数,第i趟比较len-i次 */
            if (arr[j] > arr[j+1]) { /* 相邻元素比较,若逆序则交换(升序为左大于右,降序反之) */
                temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }
        }
}
 
int main (void) {
    elemType arr[ARR_LEN] = {3,5,1,-7,4,9,-6,8,10,4};
    int len = 10;
    int i;
     
    bubbleSort (arr, len);
    for (i=0; i<len; i++)
        printf ("%d\t", arr[i]);
    putchar ('\n');
     
    return 0;
}

2、用指针

//使用指针实现冒泡排序
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#define MAX 100
//定义调用函数
void mp(int* p, int n)
{
    int i,j;
    int temp;//定义交换变量
    for (i = 0; i < n - 1; i++)//外层循环:一共要进行n-1躺循环
    {
        for (j = 0; j < n - 1 - i; j++)
        {
            if (*(p + j) > *(p + j + 1))
            {
                temp = *(p + j);
                *(p + j) = *(p + j + 1);
                *(p + j + 1) = temp;
            }
        }
    }
    //输出元素
    printf("则冒泡排序后的结果为:\n");
    for (i = 0; i < n; i++)
    {
        printf("%3d", *(p+i));
    }
}
int main()
{
    int a[MAX];
    int n;//定义个数
    int i;
    printf("请输入要比较元素的个数:");
    scanf("%d", &n);
    printf("请输入元素:");
    for (i = 0; i < n; i++)
    {
        scanf("%d", &a[i]);
    }
    //调用函数
    mp(a, n);
    
}