通过构建有序序列,对于未排序数据,在已排序序列中从前向后扫描,找到相应位置并插入。
#include <bits/stdc++.h>
using namespace std;
const int N = 102; // 定义数组最大长度,略大于题目范围,a[0]用作哨兵位
int main()
{
int n;
cin >> n; // 读取要排序的元素个数
int a[N]; // 声明数组,使用从1开始的下标(a[0]留作哨兵)
// 读取输入的n个元素,存入数组a中(从下标1开始)
for (int i = 1; i <= n; i++)
{
cin >> a[i];
}
// 插入排序的主体逻辑
for (int i = 2; i <= n; i++) // 从第2个元素开始(因为第1个元素默认已排序)
{
if (a[i] < a[i - 1]) // 如果当前元素比前一个小,说明需要插入排序
{
a[0] = a[i]; // 将当前元素存入哨兵a[0],用于后续比较和插入
int j = i - 1; // 从前面已排序的最后一个元素开始往前找插入位置
// 如果当前比较位置的元素大于待插入元素,就往后移一位
for (; a[j] > a[0]; j--)
{
a[j + 1] = a[j]; // 将a[j]往后移,为插入a[0]腾出空间
}
a[j + 1] = a[0]; // 找到正确位置后插入元素
}
}
// 输出排好序的数组
for (int i = 1; i <= n; i++)
{
cout << a[i] << " ";
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int N =102;
int main()
{
int n;
cin >>n;
int a[N];
for(int i=1;i<=n;i++)
{
cin >> a[i];
}
for(int i=2;i<=n;i++)
{
if(a[i]<a[i-1]) // 前面已排升序 a[5] < a[4]
{
a[0] = a[i]; // 暂存插入元素 a[0] = a[5]
int j= i-1; // j = 4
for (;a[j]>a[0];j--) // a[4] > a[0]成立 ,条件成立,执行循环体
{
a[j+1] = a[j]; // 元素后移 [5]= a[4]
}//执行完循环体之后,才执行 j-- ,此时j=3
a[j+1] = a[0]; // 插入正确位置 假设只有
}
}
for(int i=1;i<=n;i++)
{
cout << a[i] <<" ";
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int N =102;
int main()
{
int n;
cin >>n;
int a[N];
for(int i=0;i<n;i++)
{
cin >> a[i];
}
sort(a,a+n);
for(int i=0;i<n;i++)
{
cout << a[i] <<" ";
}
return 0;
}