插入排序算法:从无序区找元素插入到有序区内
0,42,15,20,6,8,38,50,12
注意r[0]当作哨兵
设【0,42】本身就是有序的,那么从第r[2]开始比较,这就是下面算法过程中i=2的原因
第一次for循环内容:
先把r[2]复制一份放在r[0],即有序序列变成【0,42】变成【15,42】
因为for循环的限制条件是r[0]<r[j],也就是拿r[1]~r[i-1]跟r[i]比较,即r[1]~r[1]跟r[2]比较
从r[i-1]开始比,r[j]=r[i-1]=r[2-1]=r[1]=42
r[0]是否小于r[j],也就是说15是不是小于42,是啊
那就复制一份42,把42右边的元素覆盖掉,序列【15,42,15】变成【15,42,42】
j减减,j=0, r[j]=r[0]=15,r[0]是否小于r[j],也就是说15是不是小于15,不是啊
那就把r[0]赋值给r[j+1],即把r[0]赋值给r[1],也就是说15赋值给42
序列【15,42,42】,变成【15,15,42】
第二次for循环内容:
目前序列为【15,15,42,20, 6, 8, 38, 50, 12】
此时i=3,i指向20,把20放到哨兵处
序列为目前序列为【20,15,42,20, 6, 8, 38, 50, 12】
j=i-1=3-1=2,指向42,看r[0]是否小于r[2],即20是不是小于42
是,那么把42复制一份干掉42右边的数字
此时序列为【20,15,42,42, 6, 8, 38, 50, 12】
j--,j变成1,r[0]不小于r[1],即20不小于15
那么把哨兵的位置复制,干掉r[1]前面的
此时序列为【20,15,20,42, 6, 8, 38, 50, 12】
=========================================================================
俩次挪动就完成了,接下来的步骤也是一样的,一共挪动7次,就不过多赘述了
#include <iostream>
using namespace std;
void InsertSort(int r[], int n) {
int i, j;
for (i = 2; i <= n; i++) {
//2到n也就是2到8(包括2),就是7趟
r[0] = r[i];
for (j = i - 1; r[0] < r[j]; j--)
r[j + 1] = r[j];
r[j + 1] = r[0];
}
cout << "Insert排序结果" << endl;
for (int i = 1; i <= 8; i++)
{
cout << r[i] << " ";
}
cout << endl;
}
int main()
{
int a[]= {0,42,15,20,6,8,38,50,12};//a[0]是哨兵
InsertSort(a,8);//8个数字比较7趟
return 0;
}