在不修改内容的情况下排序数组数据

时间:2014-03-17 06:53:19

标签: 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 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;
        }
    }
    }

如果我删除&符号,该功能就像传统的排序功能一样,所以当我在main函数中打印它时,数组内容已被更改。所以我想如果我改变了地址,那么当我打印它时,原始(未分类)数组就会显示,遗憾的是编译器不允许我这样做。

2 个答案:

答案 0 :(得分:2)

假设您有一个数据数组A,其中包含N元素,您无法(负担)更改,您可以创建一个初始化为P的并行数组P[i] == i 1}}表示0..N-1中的每个元素。然后,您可以安排排序算法置换数组P,使得A[P[i]]是排序顺序中的i th 元素。它不是标准的排序操作,因此您必须编写自己的排序代码,但写入并不是一件非常困难的事情。

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

答案 1 :(得分:0)

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

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

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

更多: http://en.wikipedia.org/wiki/Bubble_sort