我的代码是:
#include <iostream>
using namespace std;
void insertion(int*, int);
int main() {
int a[6] = {9, 5, 3, 7, 5, 6};
for (int i = 0; i < 6; i++)
cout << a[i] << " ";
insertion(&a[0], 6);
cout << "now insertion sort \n";
for (int x = 0; x < 6; x++)
cout << a[x] << "\n";
return 0;
}
void insertion(int* l, int m) {
int temp;
for (int i = 0; i < m; i++) {
while (*(l + i) > *(l + 1 + i) && (i > 0)) {
temp = *(l + i);
*(l + i + 1) = *(l + i);
*(l + i) = temp;
i--;
}
}
}
功能排序有什么问题?
我得到的输出是:9 5 5 7 7 7
我应该添加哪些其他细节(这是我在stackoverflow中的第一个疑问)?
答案 0 :(得分:0)
对于插入排序,您的逻辑并不正确。事实上,你现在所拥有的更接近于泡沫排序(尽管它显然也不太合适)。
对于插入排序,逻辑类似于这样(假设基于0的索引):
for i = 1 to array_length
if array[i] < array[i-1]
temp = array[i]
for j = i downto 1 && temp < array[j-1]
array[j] = array[j-1]
array[j-1] = temp
endif
所以这里的基本思想是,对于每个元素,我们向后搜索数组以找到放置该元素的正确位置。当我们这样做时,我们将元素向上移动一个点,所以当我们到达正确的位置时,我们就有了放置它的位置。
特别注意,这在任何地方都不包含任何类似交换的代码。我们通常不打算像你那样交换相邻的元素。它可能/将会发生在/如果一个元素恰好位于恰好一个位置的位置,但它确实偶然发生。