void insertsort(int *arr, int size) { for (int i = 1; i < size; i++) { int q = i; int temp = arr[i + 1]; for (q; q >= 0; q--) { if (arr[q] > temp) { arr[q + 1] = arr[q]; } } arr[q] = temp; } }
时间: 2023-11-27 16:49:54 浏览: 109
这是一个插入排序的实现,但是代码有一些问题。首先,在第4行应该是temp = arr[i]而不是temp = arr[i + 1],因为i已经在第5行自增了,所以arr[i + 1]会越界。其次,在第8行应该是arr[q + 1] = temp而不是arr[q] = temp,因为arr[q]已经被覆盖了,应该将temp插入到它后面。修改后的代码如下:
```
void insertsort(int *arr, int size) {
for (int i = 1; i < size; i++) {
int q = i - 1;
int temp = arr[i];
for (q; q >= 0; q--) {
if (arr[q] > temp) {
arr[q + 1] = arr[q];
} else {
break;
}
}
arr[q + 1] = temp;
}
}
```
这个代码中,第4行修正了越界问题,第9行加了一个break语句,可以减少比较次数,第11行修改了插入的位置。
相关问题
void insertsort(int *arr, int size) { for (int i = 1; i < size; i++) { int j = i + 1; int q=i; int temp=arr[i+1]; for (q; q >= 0; q--) { if(arr[q]>temp) { arr[q+1]=arr[q]; } } arr[q]=temp; } }
这段代码是插入排序的实现,但是它存在一些问题。首先,循环条件中的变量 j 没有使用,应该是循环条件应该是 j <= size。其次,在内层循环中,如果 arr[q] 大于 temp,应该将 arr[q] 后移一位,而不是将 arr[q+1] 赋值为 arr[q]。最后,将 temp 插入到正确的位置时,应该是将 temp 赋值给 arr[q+1],而不是 arr[q]。
下面是修改后的代码:
```
void insertsort(int *arr, int size) {
for (int i = 1; i < size; i++) {
int j = i - 1;
int temp = arr[i];
while (j >= 0 && arr[j] > temp) {
arr[j+1] = arr[j];
j--;
}
arr[j+1] = temp;
}
}
```
在内层循环中,从 q=i 改为了 j=i-1,同时使用了 while 循环。在插入元素时,将 temp 插入到了正确的位置。
请查错 void insertsort(int *arr, int size) { for (int i = 1; i < size-1; i++) { int q = i; int temp = arr[i + 1]; for (q; q >= 0; q--) { if (arr[q] > temp) { arr[q + 1] = arr[q]; } else{break;} } arr[q] = temp; } }
这段代码的问题在于,循环条件 `i < size-1` 只能对 `size` 为偶数时排序正确,如果 `size` 为奇数,则会漏掉最后一个元素。应该将循环条件改为 `i < size`。
此外,在插入排序的内层循环中,变量 `q` 的初值应该为 `i-1`,因为要从已排序的部分中从后往前遍历找到插入位置。同时,内层循环的退出条件可以简化为 `arr[q] <= temp`,因为找到了插入位置就可以退出循环了。
修改后的代码如下:
```c++
void insertsort(int* arr, int size) {
for (int i = 1; i < size; i++) {
int q = i - 1;
int temp = arr[i];
for (; q >= 0 && arr[q] > temp; q--) {
arr[q + 1] = arr[q];
}
arr[q + 1] = temp;
}
}
```
阅读全文