C 排序数组数据而不修改内容

C 排序数组数据而不修改内容,c,arrays,sorting,pointers,swap,C,Arrays,Sorting,Pointers,Swap,我试图编写一个简单的程序,读取几个整数,将它们放入一个数组,然后调用一个函数,按升序对它们进行排序。不过,我希望在不更改数组内容的情况下对它们进行排序。有没有办法做到这一点 int selection_sort(int *, int); //prototype int selection_sort(int * num,int n) //num is the first address of the array an

我试图编写一个简单的程序,读取几个整数,将它们放入一个数组,然后调用一个函数,按升序对它们进行排序。不过,我希望在不更改数组内容的情况下对它们进行排序。有没有办法做到这一点

    int selection_sort(int *, int);             //prototype

    int selection_sort(int * num,int n)                
    //num is the first address of the array and n is array length
    {
    int min, target, i, j, temp;
    for(i=0; i<n; i++)
    {
        min = num[i];
        target = i;
        for(j=i+1; j<n;j++)
        {
            if(num[j]<min)
            {
                min = num[j];
                target = j;
            }
        }
        if(target != i)                       
        {
        //My intuition tells me that here's where I need to work some magic
        temp = &num[i];                   
        &num[i] = &num[target];           //Here's what I was planning on doing
        &num[target] = temp;
        }
    }
    }

如果我删除了符号AND,该函数的工作原理与传统的排序函数类似,因此当我在主函数中打印它时,数组内容已经更改。所以我想如果我改变了地址,那么当我打印它时,原始的未排序数组就会显示出来,遗憾的是编译器不允许我这样做。

假设你有一个数据数组,其中有N个元素,你不能改变,你可以创建一个并行数组p,初始化为p[I]==0..N-1中每个元素的i。然后,您可以安排排序算法排列数组P,使得[P[i]]是排序顺序中的第i个元素。这不是一个标准的排序操作,因此您必须编写自己的排序代码,但编写排序并不困难


另一种选择是使用指针的并行数组。如果A中的元素是T类型的,那么就有T[N];作为数组的声明,您可以创建一个并行数组T*P[N];并初始化每个元素,使P[i]==&A[i]。然后,您可以使用标准qsort函数和一个适当的比较器对P进行排序,该比较器跟随指向值的指针。这可以说是一个更好的解决方案,因为它利用了标准的排序代码。排序后,可以使用*P[i]按排序顺序访问第i个值,而不会影响A本身。

如果要交换原始数组内部的元素,从而丢失原始输入的排序,但只使用与描述冒泡排序相同的初始内存占用

它确实需要在内存的初始数组中移动元素,因此它在技术上修改了输入,但我不确定这是否是您所暗示的

基本上,当您在数组中向前走时,您会按顺序将每个项与右边的项进行比较,如果它们的顺序错误,则交换它们,并重复该过程n次

更多:

告诉我:如果不更改原始数组,那么排序后的版本存在于何处?排序对您来说意味着什么?它在被调用函数中而不是在main中吗?排序时,数组的内容不会更改。只有位置才有作用。@V,从技术上讲,我仍然希望将数据交换到特定的安排。这不是排序吗?很好的回答,比我快一分钟:可以使用指针而不是创建额外的数组吗?也许可以创建一组指针,指向数组的每个地址,并交换它们的地址,而不是内容?如果愿意,您可以使用指针数组而不是整数数组,您可以付费并选择。不过,对于指针,可以使用标准排序。如果主数组A具有T类型的元素,则可以初始化P[i]=&A[i],然后使用qsort和适当的比较器函数对P进行排序。如果必须使用二次排序,则使用插入排序效率非常低。但在3/2上,Shell排序不需要太多额外的空间性能,在lgn最佳情况下,快速排序性能也不需要太多额外的空间性能;最坏的情况是ON2,但这是可以避免的。快速排序最多需要Olg N额外的空间,这很少是一个问题。这是正确的,它的效率非常低,但它基本上满足了我认为他们要求的。