用指针对二维数组进行排序的代码

标签 c arrays sorting pointers selection

我编写了这段代码来对指针数组进行排序,数组中的每个第一个元素告诉我们第一个元素之后有多少元素。现在我希望代码自己对所有行进行排序(选择排序或任何其他排序),并保留第一个元素(因为他告诉我们数组的大小)。该代码对大指针数组中的第一个数组进行排序,但对最后一个数组(4,5,6,2,1)不起作用。帮助任何人吗?仅在函数中使用指针!(不是 [ 和 ]):)

#include <stdio.h>
#include <stdlib.h>

#define LENGTH 5

void sortArrayAfterFirstPlace(int* pointersArray[], int len);
void printsMatrix(int* pointersArray[], int len);
int main(void)
{
    int firstArr[4] = { 3,9,6,7 };
    int secondArr[3] = { 2, 5, 5 };
    int thirdArr[1] = {0};
    int forthArr[2] = {1,6};
    int fifthArr[5] = {4,5,6,2,1};
    int* arrOfPointers[LENGTH] = { firstArr, secondArr,thirdArr,forthArr,fifthArr };
    sortArrayAfterFirstPlace(arrOfPointers,LENGTH);
    printsMatrix(arrOfPointers,LENGTH);
    system("PAUSE");
    return 0;
}

/*
*/
void sortArrayAfterFirstPlace(int* pointersArray[], int len)
{
    int i = 0,j=0,temp=0;
    int min = 0;
    int lengthOfFirstElement = 0;
    for (i = 0; i < len; i++)
    {
        lengthOfFirstElement = *(*(pointersArray + i));
        for (j = i+1; j < lengthOfFirstElement; j++)
        {
            if (*(*(pointersArray + i) + j) > *(*(pointersArray + i) + j + 1))
            {
                temp = *(*(pointersArray + i) + j);
                *(*(pointersArray + i) + j) = *(*(pointersArray + i) + j + 1);
                *(*(pointersArray + i) + j + 1) = temp;
            }
        }

    }
}

/*
*/
void printsMatrix(int* pointersArray[],int len)
{
    int i = 0,j=0;
    int lengthOfFirstElement = 0;
    for (i = 0; i < len; i++)
    {
        lengthOfFirstElement = *(*(pointersArray+i));
        for (j = 0; j <lengthOfFirstElement+1; j++)
        {
            printf("%d ", *(*(pointersArray + i) + j));
        }
        printf("\n");
    }
}

最佳答案

您需要能够通过循环访问这些数组的指针数组来访问要排序的每个数组。

对于每个要排序的数组,您需要创建一个指向其第一个元素 [0] 的指针,并从中获取要排序的元素数。 现在您拥有循环每个数字数组并进行排序所需的信息 - 数组的地址和要排序的元素数量。

在进行简单的冒泡排序时,您不需要两个循环 - i 和 j - 因为您只将数组中的一个元素与其后面的元素进行比较,但您确实需要能够判断每个元素何时按顺序,因此可以在 while 循环中使用指示没有元素被交换的标志 - 当该标志指示在上次运行数组时没有元素被交换时,跳出 while 循环。

这是外循环 - 您仍然需要对每个数组进行排序,并使用相同的外循环方法进行打印。

void sortArrayAfterFirstPlace(int *aofptrs[], int len);
void printout(int *aofptrs[], int len);
int main(void)
{
    int firstArr[4] = { 3,9,6,7 };
    int secondArr[3] = { 2, 5, 5 };
    int thirdArr[1] = {0};
    int forthArr[2] = {1,6};
    int fifthArr[5] = {4,5,6,2,1};
    int *arrOfPointers[LENGTH] = { firstArr, secondArr,thirdArr,forthArr,fifthArr };

    printout(arrOfPointers,LENGTH);
    sortArrayAfterFirstPlace(arrOfPointers,LENGTH);
    printout(arrOfPointers,LENGTH);
}

排序数组的外循环:

void sortArrayAfterFirstPlace(int *aofptrs[], int len)
{
    int arypt, *ptr, numberOfElements, i, sorted, temp;

    /* loop through array of pointers to arrays) */
    for (arypt = 0; arypt < len; arypt++) {
        /* get pointer to array to be sorted */
        ptr = *(aofptrs + arypt);
        /* get number of elements to be sorted from element 0 */
        numberOfElements = *ptr;
        /* sort array */
        while (1) {
            sorted = 1;
            for (i = 1; i < numberOfElements ; i++) {

                // your sort goes here
                // (*(ptr + i) accesses elements in the array
                // (*(ptr + i + 1) access following element in array
                // sorted = 0; if two elements were swapped

            }
            if(sorted == 1) break; // elements were all in order
        }
    }
}

关于用指针对二维数组进行排序的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36281674/

相关文章:

C - 二叉搜索树

c - 如何从数组的结构指针中更改数组中的值?

java - 将新值添加到现有数组的开头

c++ - 从 C++ 中的函数返回数组

Java ArrayList 按相同顺序对两个列表进行排序

c - 不使用print语句给出输出

c++ - 使用 SIMD/SSE 的水平运行差异和条件更新?

javascript - 将函数数组作为 bool 数组返回

javascript - 使用选择框编辑表格

python - 根据长度排序python列表,然后根据内容排序