c ++插入排序错误

时间:2017-09-22 01:48:08

标签: c++ runtime-error insertion-sort

编译时,会出现读取访问冲突错误。其他堆栈溢出帖说这是由于无限循环。我还看到该值变为非常大的负数。我的猜测是因为列表[-1],但我不知道如何改变它所以它不会超过列表[0]。

插入排序代码

void insertion_sort(int list[], int length) {

for (int i = 1; i < length; i++) {
    for (int j = i; (j > 0) && (list[j] < list[j - 1]); j--) {
            swap(list, list[j - 1], list[j]);
    }
}

}

交换功能代码

void swap(int list[], int & src, int & dest){ 
    int temp = list[src];
    list[src] = list[dest];
    list[dest] = temp;
}

2 个答案:

答案 0 :(得分:1)

您正在使用排序值作为交换中的索引。保持简单。

这很有效。

void insertion_sort(int list[], int length) {

    for (int i = 1; i < length; i++) {
        for (int j = i; (j > 0) && (list[j] < list[j - 1]); j--) {
            std::swap( list[j - 1], list[j] );
        }
    }
}

int main( )
{

    int arr[ 100 ];
    for( size_t i= 0; i < 100; ++i )
        arr[ i ]= std::rand( );

    insertion_sort( arr, 100 );

    return 0;
}

添加了:

因为这看起来像课堂练习。您要注意的是std::swap不知道您的list存在。它想要知道的是你想要交换的价值。因此,如果您无法使用标准库,请按标准编写交换。

答案 1 :(得分:0)

void insertion_sort(int list[], int length) {

for (int i = 1; i < length; i++) {
    j = i;
    while(j > 0 && list[j - 1] > list[j]){
      swap(list, list[j], list[j-1]);
      j--;
    }
}

这应该适用于从最小到最大的排序。 while循环执行检查是否需要交换的工作并检查已经排序的&#34;已排序的&#34;如果需要再次交换数组中的位置。

快乐编码。