我基本上处理以下问题,我试图改变插入排序,以便它也可以删除它反复的重复项。以下是插入排序。
public void insertSort() {
for (int i = 1; i < nElems; i++) {
int temp = a[i];
int j = i;
while (j > 0 && temp <= a[j - 1]) {
a[j] = a[j - 1];
j--;
}
a[j] = temp;
}
}
我不确定我是否正确理解了这种方法。如果我正确地理解了这一点(请告诉我,如果我错了)这种方法建议我应该在内部while循环开始之前遍历整个数组,并用任意数字标记任何副本,例如-1。然后当内部while循环开始时,它将对数组进行排序,并且所有重复项将在开头一起堆叠。
如果是这种情况,那么我可以简单地在插入排序开始之前将数组中的每个元素相互比较并标记任何重复项 - 1然后插入排序将处理排序部分。之后我可以减少arraySize。
但我觉得我没有正确理解,所以有人可以对此提出任何建议吗?
答案 0 :(得分:4)
您只需在while循环中添加一行。
while (j > 0 && temp <= a[j - 1]) {
if(temp == a[j - 1]) temp = -1;
a[j] = a[j - 1];
j--;
}
您可以将阵列视为包含两个部分。第一部分从0到i-1并进行排序。第二部分从i到数组的末尾,未分类。 在循环的每次迭代中,您将获取第一个未排序的元素(即[i])并将其置于temp中。这是您要插入已排序部分的元素。然后,将已排序部分的所有元素向上移动,直到找到要插入temp的位置。 如果将temp更改为-1,则您现在尝试插入的元素将变为-1。排序算法将继续尝试在正确的位置插入-1,这是数组的开头。
答案 1 :(得分:1)
public void InsertSort()
{
int t, j;
for (int i = 1; i < _leght; i++)
{
t = _arr[i];
for (j = i; j > 0; )
{
if (_arr[j - 1] == t) t = -1;
if (_arr[j - 1] > t)
{
_arr[j] = _arr[j - 1];
j--;
}
else break;
}
_arr[j] = t;
}
}