#include <stdio.h>
//首先我们需要知道原理
//插入排序 是在前部分是有序的情况下 将后部分插入到前部分
//如果一开始就是乱序的 我们可以直接把第一个数据看成是有序的 然后循环插入即可
//经了解 插入排序有一个外循环和一个内循环
//外循环控制一共循环的次数
//内循环控制找到插入的位置
//下面是原始插入排序和其变种
void insert_sort1(int data[],int n)
{
int i,j,swap_value;
for(i = 1 ; i < n ; i++)
{
swap_value = data[i];
for(j = 0 ; j < i ; j++)
if(data[j] > data[i]) break; //找到插入的位置
//如果插入数值 那么之后的所有数值的索引都要加1
//那我们可以用循环把每个数值往后移动一个索引
for(int t = i ; t > j ; t--)
{
//这里很巧妙 这时候你要插入的就是data[t]=data[i]的数据 把data[i]前面一直到data[j]的位置全部都向后移动一个索引
//这样就不会影响到整个数组了
data[t] = data[t-1];
}
//这时候就已经把原来的data[j]的值的位置换成了data[j+1]的位置了
//所以 这个时候的data[j]里面是没有值的 正好给data[i]插入进去
data[j] = swap_value;
}
}
//变种就好理解多了 原理就是首先让有序数据的最后一个 无序数据的第一个比较 如果有序的元素比它大 那么就调换
//不过不比他大 那就一直往前循环下去
void insert_sort2(int data[],int n)
{
int i,j,swap_value;
for(i = 1 ; i < n ; i++)
{
for(j = i ; j > 0 ; j--)
{
if(data[j] < data[j-1])
{
swap_value = data[j];
data[j] = data[j-1];
data[j-1] = swap_value;
}
}
}
}