插入排序:当33被插入时发生了什么?

新手上路,请多包涵

以下代码是做插入排序的例子,未排序数据list,按照顺序插入到结果数组result中。

在用第六个元素33插入已经排序好的结果数组result时,发现传入的结果数组发生了变化,产生了脏数据。这是为什么呢?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "insert.h"

#define MAX_NUMBER 7

int main()
{
    int list[MAX_NUMBER] = {57,48,79,65,15,33,52};
    int* result;
    int signal = 0;//this is the flag of already inserted

    result = malloc(sizeof(int));
    memset(result, 0, 1);

    result[0] = list[0];

    for(int i = 1; i < MAX_NUMBER; i++)
    {
        for(int j = 0; j < i; j++)
        {
            if(result[j] >= list[i])
            {
                result = insert(result, i, j, list[i]);
                signal = 1;
                break;
            }
        }
        if(signal == 0)
        {
            result = insert(result, i, i, list[i]);
        }
        signal = 0;
    }

    for(int k = 0; k < MAX_NUMBER; k++)
    {
        printf("%d\n", result[k]);
    }

    return 0;
}

int* insert(int* const array, size_t len, int pos, int value)
{
    int *newarray;
    newarray = malloc(sizeof(int)*(len & INT32_MAX + 1));

    if( len >= pos)
    {
        memcpy(newarray, array, sizeof(int)*pos);
        newarray[pos] = value;
        memcpy(newarray + pos + 1, array + pos, sizeof(int)*(len - pos));
    }else{
        return array;
    }
    return newarray;
}

在33插入之前,result数组的结果是{15,48,57,65,79}
而在插入33后,result队列已经变成了{15,33,48,52,57,15,33}

这个现象并不是每一次发生,有大概一小部分情况会显示正确的序列。这是为什么呢?

阅读 2.1k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进