您的位置:首页 > 理论基础 > 数据结构算法

[算法与数据结构] - No.1 直接插入排序

2017-08-01 14:59 337 查看
插入排序的基本思想 每步将一个待排序的对象, 按其排序码大小,  插入到前面已经排好序的一组对象的适当位置上, 直到对象全部插入为止

当算法进行到第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.文章不妥之处还望指正
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: