如何在不改变数组顺序的情况下对数组中的指针进行冒泡排序

How to bubblesort a pointers in the array without changing order of the array

假设我有两个数组 intdataArray[10] = {61 34 46 114 73 29 13 93} 和 int *pointerDataArray[10],它们在相同的各自索引中具有 dataArray 的指针。我如何能够通过指针对数组进行排序并获得排序后的数组,同时仍然能够打印原始数组。

我的冒泡排序工作正常,但它也在更改 dataArray。

这是想要的输出(正确)

dataArray before sort: 61 34 46 114 73 29 13 93
pointerArray before sort: 61 34 46 114 73 29 13 93
dataArray after sort: 61 34 46 114 73 29 13 93
pointerArray after sort: 13 29 34 46 61 73 93 114

这是我得到的输出(错误)

dataArray before sort: 61 34 46 114 73 29 13 93
pointerArray before sort: 61 34 46 114 73 29 13 93
dataArray after sort: 13 29 34 46 61 73 93 114
pointerArray after sort: 13 29 34 46 61 73 93 114

这是我的代码

#include <iostream>
#include <fstream>

using namespace std;

int readFile(string filename, int dataArray[10], int *pointerDataArray[10]);
void pointerSort(int dataArray[],int *pointerDataArray[] , int length);
void swapIntPtr(int *p1, int *p2);
void displayDataArray(int dataArray[], int length);
void displayPointerArray(int *pointerDataArray[], int length);

int main() {
    int dataArray[10] = {};
    int *pointerDataArray[10];

    int length = readFile("arrayData.txt", dataArray, pointerDataArray);

    cout << "dataArray before sort: ";
    displayDataArray(dataArray, length);
    cout << "pointerArray before sort: ";
    displayPointerArray(pointerDataArray, length);
    cout << endl;

    pointerSort(dataArray, pointerDataArray, length);

    cout << "dataArray after sort: ";
    displayDataArray(dataArray, length);
    cout << "pointerArray after sort: ";
    displayPointerArray(pointerDataArray, length);

}

int readFile(string filename, int dataArray[10], int *pointerDataArray[10]) {
    ifstream inputFile(filename);
    if (inputFile.is_open()) {

        int length;
        inputFile >> length;
        for (int i = 0; i < length; i++) {
            inputFile >> dataArray[i];
            pointerDataArray[i] = &dataArray[i];
        }
        return length;
    }
    return -1;
}

void pointerSort(int dataArray[],int *pointerDataArray[] , int length){
    int i, j;
    for (i = 0; i < length-1; i++)
        for (j = 0; j < length-i-1; j++)
            if (dataArray[j] > dataArray[j+1]) {
                swapIntPtr(&dataArray[j], &dataArray[j + 1]);
            }
}

void swapIntPtr(int *pointer1, int *pointer2) {
    int pSwap = *pointer1;
    *pointer1 = *pointer2;
    *pointer2 = pSwap;
}

void displayDataArray(int dataArray[], int length){
    for (int i = 0; i < length; i++) {
        cout << dataArray[i] << " ";
    }
    cout << endl;
}

void displayPointerArray(int *pointerDataArray[], int length){
    for (int i = 0; i < length; i++) {
        cout << *pointerDataArray[i] << " ";
    }
}

在您的 pointerSort 函数中,您在两个整数的地址中调用 swapIntPtr 函数。它实际上改变了指针后面的内容,即它交换了整数。相反,您想用指针的地址调用 swapIntPtr 并且该函数需要更改指针。

void swapIntPtr(int **pointer1, int **pointer2) {
    int* pSwap = *pointer1;
    *pointer1 = *pointer2;
    *pointer2 = pSwap;
}

另外,请务必更改顶部的声明。

然后,您需要将 pointerDataArray

上的排序函数更改为 运行
void pointerSort(int dataArray[],int *pointerDataArray[] , int length){
    int i, j;
    for (i = 0; i < length-1; i++)
        for (j = 0; j < length-i-1; j++)
            if (*pointerDataArray[j] > *pointerDataArray[j+1]) {
                swapIntPtr(&pointerDataArray[j], &pointerDataArray[j + 1]);
            }
}

完整的代码如下所示:

#include <iostream>
#include <fstream>

using namespace std;

int readFile(string filename, int dataArray[10], int *pointerDataArray[10]);
void pointerSort(int dataArray[],int *pointerDataArray[] , int length);
void swapIntPtr(int **p1, int **p2);
void displayDataArray(int dataArray[], int length);
void displayPointerArray(int *pointerDataArray[], int length);

int main() {
    int dataArray[10] = {};
    int *pointerDataArray[10];

    int length = readFile("arrayData.txt", dataArray, pointerDataArray);

    cout << "dataArray before sort: ";
    displayDataArray(dataArray, length);
    cout << "pointerArray before sort: ";
    displayPointerArray(pointerDataArray, length);
    cout << endl;

    pointerSort(dataArray, pointerDataArray, length);

    cout << "dataArray after sort: ";
    displayDataArray(dataArray, length);
    cout << "pointerArray after sort: ";
    displayPointerArray(pointerDataArray, length);

}

int readFile(string filename, int dataArray[10], int *pointerDataArray[10]) {
    ifstream inputFile(filename);
    if (inputFile.is_open()) {

        int length;
        inputFile >> length;
        for (int i = 0; i < length; i++) {
            inputFile >> dataArray[i];
            pointerDataArray[i] = &dataArray[i];
        }
        return length;
    }
    return -1;
}

void pointerSort(int dataArray[],int *pointerDataArray[] , int length){
    int i, j;
    for (i = 0; i < length-1; i++)
        for (j = 0; j < length-i-1; j++)
            if (*pointerDataArray[j] > *pointerDataArray[j+1]) {
                swapIntPtr(&pointerDataArray[j], &pointerDataArray[j + 1]);
            }
}

void swapIntPtr(int **pointer1, int **pointer2) {
    int* pSwap = *pointer1;
    *pointer1 = *pointer2;
    *pointer2 = pSwap;
}

void displayDataArray(int dataArray[], int length){
    for (int i = 0; i < length; i++) {
        cout << dataArray[i] << " ";
    }
    cout << endl;
}

void displayPointerArray(int *pointerDataArray[], int length){
    for (int i = 0; i < length; i++) {
        cout << *pointerDataArray[i] << " ";
    }
}