如何以升序或降序打印数组而不打扰数组并且不使用临时数组或变量进行交换?

时间:2016-10-21 10:16:49

标签: c arrays sorting

程序应该按升序或降序打印数组元素而不会打扰数组,我们不能使用swap或任何临时变量。

print_sort(array, sizeofarray);

2 个答案:

答案 0 :(得分:0)

使用数组的指针并使用偏移值来访问数组值。

#include <stdio.h>

int main () {

   /* an array with 5 elements */
   double balance[5] = {1000.0, 2.0, 3.4, 17.0, 50.0};
   double *p;
   int i;

   p = balance;

   /* output each array element's value */
   printf( "Array values using pointer\n");

   for ( i = 0; i < 5; i++ ) {
      printf("*(p + %d) : %f\n",  i, *(p + i) );
   }

   printf( "Array values using balance as address\n");

   for ( i = 0; i < 5; i++ ) {
      printf("*(balance + %d) : %f\n",  i, *(balance + i) );
   }

   return 0;
}

来源:https://www.tutorialspoint.com/cprogramming/c_pointer_to_an_array.htm

答案 1 :(得分:0)

C99 Standard中的

(部分)解决方案。如果数字重复就会中断。

#include <assert.h>
#include <limits.h>
#include <stdbool.h>
#include <stddef.h>
#include <stdio.h>

static bool is_smallest(const int *array, size_t size, int n, int min)
{
    assert(size != 0);

    if (size == 1)
    {
        if (array[0] <= min)
            return n > min;

        return n <= array[0];
    }

    return (array[0] <= min ? n > min : n <= array[0]) &&
        is_smallest(array + 1, size - 1, n, min);
}

static void print_sort2(const int *array, size_t size, size_t index, int min)
{
    if (index >= size)
        return;

    if (is_smallest(array, size, array[index], min))
    {
        printf("%d ", array[index]);
        print_sort2(array, size, 0, array[index]);
    }
    else
        print_sort2(array, size, index + 1, min);
}

static void print_sort(const int *array, size_t size)
{
    print_sort2(array, size, 0, INT_MIN);
    printf("\n");
}

int main(void)
{
    const int array[] = {-100, 32, -1, 4, 66, 0, -5, -500, 2};
    const size_t size = sizeof array / sizeof array[0];

    print_sort(array, size);
    print_sort((const int []){1, 5, 4, 2, 3}, 5);
    print_sort((const int []){1, 2, 3}, 3);
    print_sort((const int []){10, -10, 20, 30, 0}, 5);
}