我正在阅读教授的讲座并实施他的代码,以便更好地理解每种排序算法。
我们进行了插入排序并注意到有3种不同的类型:
我实现的问题是插入排序直到找到如下: 与基本插入排序相同,除了j-loop(内部循环)一旦被定位的元素相对于前一个元素排序就终止。终止有效,因为所有前面的元素已经排序。算法如下:
for i = 2 to n
j = i
while (a[j] < a[j-1]) and (j>1)
swap (a[j],a[j-1]), set j=j-1
endwhile
endfor
他的伪代码算法很奇怪,因为假设数组从1开始,所以当我用C ++实现它时,显然不会对第一个元素进行排序。当我想要它开始假设0是我超出我的范围的第一个元素。我有义务在外循环中进行检查,这样可以成功排序。
以下是我之前使用的C ++实现:
void insertionSortTilLocated(vector<int>vector)
{
for (int i = 2; i < vector.size(); i++)
{
int j = i;
while (vector[j] < vector[j - 1] && j > 1)
{
swap(vector[j], vector[j - 1]);
j = j - 1;
}
}
cout << "Insertion sort til located" << endl;
for (int k = 0; k < vector.size(); k++)
{
cout << vector[k] << endl;
}
}
我实施的添加的检查交换是成功的:
void insertionSortTilLocated(vector<int>vector)
{
for (int i = 2; i < vector.size(); i++)
{
...
//Swap Check added
if (vector[0] > vector[1])
{
swap(vector[0],vector[1]);
}
}
...
}
即使我设法解决了我的问题,但我想知道,我在哪里可以找到更好的算法?我无法找到它进行搜索并找到“Insertion Sort Till located”的结果,而我正在使用的教科书并未使用此算法解决这个问题。有人可以提供算法的增强版本,这样更有意义吗?或者至少对它有一个增强的解释,这样更有意义吗?
由于