插入排序的基本思想 每步将一个待排序的对象, 按其排序码大小, 插入到前面已经排好序的一组对象的适当位置上, 直到对象全部插入为止
当算法进行到第i遍时,对于下表为i的数组元素arr[i]:
判断arr[i] 与[0,i-1]内数组的关系;
找到下标j(j>=0 && j<i-1)使得arr[i]>arr[j]
将[j+1,i-1]内的数向后移以为,将arr[i]插入到arr[j+1]上
算法描述为
InsertSort.cpp
#include <iostream>
#include <cstdlib>
#include <cstdio>
using namespace std;
int main()
{
int n;
int arr [1000] = {0};
while(cin >> n)
{
//读入数组
for(int i = 0 ; i < n ; i ++)
{
cin>>arr[i];
}
int j,k,l;
//算法执行 k-1 次
for(k = 1; k<n; k++)
{
//从后往前找第一个比arr[k]小的数
for(j = k-1; j>=0; j--)
{
if(arr[k]>=arr[j])
{
break;
}
}
//如果j = k-1 不需要交换
if(j!=k-1)
{
int temp = arr[k];
for(l = k-1; l>j; l--)
{
arr[l+1] = arr[l];
}
arr[j+1] = temp;
}
}
for(int i = 0 ; i < n ; i ++)
{
cout<<arr[i]<<" ";
}
}
return 0;
}
这是最简单的插入排序,先搜索然后移动插入。我们可以把搜索和插入的这个步骤合并起来
#include <iostream>
#include <cstdlib>
#include <cstdio>
using namespace std;
int main()
{
int n;
int arr [1000] = {0};
while(cin >> n)
{
//读入数组
for(int i = 0 ; i < n ; i ++)
{
cin>>arr[i];
}
int j,k,l;
for(k = 1; k < n ; k ++)
{
//如果 arr[k] 比 arr[k-1]大,由于之前都是有序的,所以不用插入
if(arr[k]<arr[k-1])
{
int temp = arr[k];
//比较后的直接移动
for(j = k - 1;j>=0 && arr[j]>temp;j--)
{
arr[j+1] = arr[j];
}
arr[j+1] = temp;
}
}
for(int i = 0 ; i < n ; i ++)
{
cout<<arr[i]<<" ";
}
}
return 0;
}
减少了一个for循环,只需要两个for循环
P.S.文章不妥之处还望指正