#include <iostream>
using namespace std;
void print_array(int array[], int size)
{
cout<< "insertion sort steps: ";
int j;
for (j=0; j<size;j++)
cout <<" "<< array[j];
cout << endl;
}
void insertion_sort(int a[], int n)
{
int i;
for(int j = 1; j < n; j++) {
i = 0;
while ((a[j] > a[i])) {
i = i+1;
}
int m = a[j];
for(int k = 0; k <= (j-i-1); k++) {
a[j-k] = a[j-k-1];
}
a[i] = m;
print_array(a,n);
}
}
int main() {
int array[6]= {3,2,4,5,1,6};
insertion_sort(array,6);
return 0;
}
我试图修改这个插入排序,它使用线性搜索技术,通过首先将第j个元素与(j-1)st元素进行比较,然后将第(j-1)个元素与第j个元素进行比较,将第j个元素插入到正确的位置必要时可以使用元素,等等。
所以i = 0;
说它应该是i = j-1;
我的尝试:
void insertion_sort(int a[], int n)
{
int i;
for(int j = 1; j < n; j++) {
i = j-1;
while ((a[j] > a[i]) && (i > 0)) {
i = i-1;
}
int m = a[j];
for(int k = (j-i-1); k >= 0; k--) {
a[j-k] = a[j-k-1];
}
a[i] = m;
print_array(a,n);
}
}
这是输出
insertion sort steps: 2 3 4 5 1 6
insertion sort steps: 4 2 2 5 1 6
insertion sort steps: 5 4 4 4 1 6
insertion sort steps: 5 4 4 1 4 6
insertion sort steps: 6 5 5 5 5 5
第一步是第二步工作正确,一切都开始失败。
答案 0 :(得分:0)
在
while ((a[j] > a[i]) && (i > 0)) {
i = i-1;
}
是错误的,因为如果a[j]
不被移动,它会导致0
插入索引a[j]
。将其更改为
while (0 <= i && a[j] < a[i]) --i;
++i;
此外,移位循环错误且复杂 - 将其更改为
int m = a[j];
for (int k = j; k > i; k--) a[k] = a[k-1];
a[i] = m;