算法核心:
直 接 插 入 一 个 数 到 末 尾 , 把 当 前 的 序 列 调 整 成 有 序 , 以 待 下 一 次 插 入 \color{red}{直接插入一个数到末尾,把当前的序列调整成有序,以待下一次插入} 直接插入一个数到末尾,把当前的序列调整成有序,以待下一次插入
( 对 已 经 有 序 的 序 列 来 说 , 新 插 入 数 的 位 置 容 易 确 认 ) \color{red}{(对已经有序的序列来说,新插入数的位置容易确认)} (对已经有序的序列来说,新插入数的位置容易确认)
解析:(完整代码在最后面)
一:参数
a为目标数组
n为对n个数字进行排序
二:代码具体分析
每次 for 循环完成的事:
往 末 尾 插 一 个 数 , 然 后 调 整 \color{green}{往末尾插一个数,然后调整} 往末尾插一个数,然后调整
while(j>=0&&a[x]<a[j]){ //妙啊!因为之前的是已经排好序的了
temp=a[x];
a[x]=a[j];
a[j]=temp;
x=j;
j--;
}
上面的while循环完成的事:
从 末 尾 开 始 , 如 果 比 前 一 个 数 小 , 则 交 换 位 置 , 循 环 进 行 \color{green}{从末尾开始,如果比前一个数小,则交换位置,循环进行} 从末尾开始,如果比前一个数小,则交换位置,循环进行
在 某 次 循 环 中 , 不 用 交 换 了 , 也 就 可 以 跳 出 循 环 了 , 不 必 把 整 个 数 组 遍 历 完 \color{red}{在某次循环中,不用交换了,也就可以跳出循环了,不必把整个数组遍历完} 在某次循环中,不用交换了,也就可以跳出循环了,不必把整个数组遍历完
完整代码:
void x(int *a,int n){
if(a==NULL)return;
int temp,x;
int j;
for(int i=1;i<n;i++){
x=i;
j=i-1;
while(j>=0&&a[x]<a[j]){ //妙啊!因为之前的是已经排好序的了
temp=a[x];
a[x]=a[j];
a[j]=temp;
x=j;
j--;
}
}
return;
}