插入排序

插入排序简单来说 假设数组第一个元素为一个有序序列 然后将后面的无序序列依次与第一个元素比较 更具大小决定待插入元素插入的位置。
、、、
// 插入排序 是吧无序序列中的元素依次插入到有序序列中,一般是从有序序列的尾部开始比较
void InsertSort(int buf[10], int bufsize)
{
int temp = 0; // 用于备份当前待插入元素的值
int current_prev = 0; // 备份待插入元素的下标(2)

// 可以假设把数组中的第一个元素座位有序序列的元素,剩下的元素作为无序序列
for (int i = 1; i < bufsize; ++i)    //(1)
{
    temp = buf[i]; // 备份当前待插入元素的值
    // 把当前待插入元素和有序序列中的元素依次进行比较,从有序序列尾部开始
    for (int j = i - 1; i >= 0; j--)
    {
        if (temp < buf[j]) // 当前插入元素的值 小于待插入元素的直接前驱元素的值
        {
            current_prev = j;    // 备份当前待插入元素的直接前驱的下标(3)
            buf[j + i] = buf[i]; // 后移
        }
        else
        {
            current_prev = j + i;
            break;
        }
    }
    // 把待插入元素插入指定位置
    buf[current_prev] = temp;
}

}、、、
本题需要思考的两个问题
1.为何 (1)int i 从1 开始i++
答:已经假设了第一个下标为0 的元素为一个有序数列 没必要自己和自己再比较
2.为何 (2)(3)要对待插入元素的下标进行备份?
答:如图这种情况


会发现插入之前 i=1 j=0,当j进行j--时 j=-1 ,不满足第二个for循环,下标为负数没有意义 ,知道temp=3但是不知道它插入位置的下标。
此时在第二个for循环中备份 j=0当前下标的地址[current_prev] temp就有目标元素下标进行插入 ,j等于-1则不进入第2个for循环 。****

posted @ 2024-05-06 20:53  fzhyy  阅读(21)  评论(0)    收藏  举报