我正在尝试编写一个简单的程序,它读取几个整数,将它们放入一个数组中,然后调用一个按升序对它们进行排序的函数。但是,我想要在不改变数组内容的情况下对它们进行排序。有没有办法做到这一点?
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函数中打印它时,数组内容已被更改。所以我想如果我改变了地址,那么当我打印它时,原始(未分类)数组就会显示,遗憾的是编译器不允许我这样做。
答案 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
次过程。