(C)使用两个指针组织整数数组

时间:2017-03-23 12:27:55

标签: c arrays

我正在尝试按递增和递减顺序组织数组,而不会改变其原始位置,也不会创建新的。关键是:我只需要使用两个指针就可以了。由于它们的增加和减少顺序都是模拟的,所以我专注于增加的功能。

我的算法看起来像插入排序类型。但是,不是通过所有阵列,然后向后走,以确保外观是正常的,我编码,因为它向前迈出了一步,然后看看后面的所有。如果前一个元素安装在正确的位置,那么它不必检查其他元素,然后它打破了花边:

  

有(; Z大于0; Z - )

我不太确定会发生什么事。例如,“ - 8 10 2 0”的输出为:

在数组中包含整数: -8 10 2 0

数组:原创。

整数:-8 ||地址:0x7ffc88143d20

整数:10 ||地址:0x7ffc88143d24

整数:2 ||地址:0x7ffc88143d28

整数:0 ||地址:0x7ffc88143d2c

增加订单:

整数:2 || last_shown:-8

整数:0 || last_shown:2

整数:-2011939296 || last_shown:0

#include <stdio.h>

#define N 4
void get_data(int *array)
{
    int i;
    printf("Include integers in the array:\n");
    for (i = 0; i < N; i++)
    {
        scanf("%d", &array[i]);
    }
}
void shows_original(int *array)
{
    int i;
    printf("array: original.\n");
    for (i = 0; i < N; i++)
        printf("Integer: %d || Address: %p\n", array[i], &array[i]);
    printf("\n");
}
void increasing_order(int* DataArray)
{
    int i, z;
    int *current_ptr = DataArray, *last_shown = DataArray;
    printf("Increasing order:\n");
    for (i = 0; i < N; i++)
    {
        z = i;
        if (DataArray[i + 1] >= DataArray[i] && *current_ptr >= *last_shown)
        {
            current_ptr = &DataArray[i];
            for (; z > 0; z--)
            {
                if (*current_ptr >= DataArray[z - 1])
                {
                    if (&DataArray[z - 1] == last_shown)
                        continue;
                    else
                    {
                        last_shown = current_ptr;
                        current_ptr = &DataArray[z - 1];
                    }
                }
                else
                    break;
            }
            last_shown = current_ptr;
        }
        else if (DataArray[i + 1] < DataArray[i] && *current_ptr >= *last_shown)
        {
            current_ptr = &DataArray[i + 1];
            for (z; z > 0; z--)
            {
                if (*current_ptr >= DataArray[z - 1])
                {
                    if (&DataArray[z - 1] == last_shown)
                        continue;
                    else
                    {
                        last_shown = current_ptr;
                        current_ptr = &DataArray[z - 1];
                    }
                }
                else
                    break;
            }
            printf("Integer:    %d||last_shown: %d\n", *current_ptr,
                    *last_shown);
            last_shown = current_ptr;
        }
    }
    printf("\n");
}

int main()
{
    int DataArray[N];
    get_data(DataArray);
    shows_original(DataArray);
    increasing_order(DataArray);
    /*decreasing_order(DataArray);*/
    printf("\n");
    return 0;
}

任何人都可以帮助我吗?欢呼声。

1 个答案:

答案 0 :(得分:0)

您如何看待这个版本?

int *next=DataArray;
int *end=DataArray+N;
for(pt=DataArray; pt<end; pt++) {
    if(*pt<*next) next=pt;        // find smallest
}
for(last=next, next=null; last!=null; last=next, next=null ) {
    for(pt=DataArray; pt<end; pt++) {
        if(*pt==*last)            // print all current smallest
            printf("%d: %d\n", pt-DataArray, *pt);
        else if(*pt>*last && (next==null || *pt<*next))
            next=pt;              // find next greater smallest
    }
}