上上次说了相对简单的选择排序,这次来说有“亿”点点难的插入排序。
一.插入排序:
1.算法步骤:
将第一个元素看作已排序序列,第二个到最后一个看作未排序序列。第二个元素,与之前已排序号的序列进行对比,插入正确的位置(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。)循环处理剩下的未排序序列。
2.动画:
3.代码演示:
把n个数从小到大输出.......
#include<bits/stdc++.h>
using namespace std;
int n,i,j,k,tmp,a[100005];
int main(){
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
for(int i=2;i<=n;i++)
{
tmp=a[i],k=1;
while(a[k]<=tmp)k++;
for(int j=i-1;j>=k;j--)a[j+1]=a[j];
a[k]=tmp;
}
for(int i=1;i<=n;i++)
cout<<a[i]<<" ";
return 0;
}
4.主代码解析:
for(int i=2;i<=n;i++)
{
tmp=a[i],k=1;
while(a[k]<=tmp)k++;
for(int j=i-1;j>=k;j--)a[j+1]=a[j];
a[k]=tmp;
}
1.tmp是我们要插入的数,k是我们要插入的位置!!!
tmp=a[i],k=1;
2.while循环直到找到要插入的位置为止!!!
例如:
个数:6
数据:1 2 3 5 9 6
下标:1 2 3 4 5 6
5=k,6=tmp;
while(a[k]<=tmp)k++;
3.交换且插入!!!
个数:6
数据:1 2 3 5 9 6
下标:1 2 3 4 5 6
6 9
for(int j=i-1;j>=k;j--)a[j+1]=a[j];
a[k]=tmp;