直接插入排序的基本思想:将待排序数组分为两部分:已排好序部分和未排序部分。其主要步骤为:
开始时,第一个元素在已排好序部分中,其余部分在未排序部分。然后依次从
插入排序的具体做法:在插入第i个记录时,k1,k2,k3,...,ki-1,已经排好序,将关键字ki依次与ki-1,ki-2,...,k2,k1
进行比较,从而找到应该插入的位置,然后将ki 插入,插入位置及其后的记录依次后移动。
插入排序和打扑克牌时,抓牌整理牌很相似。再抓第一张牌时,不需要进行任何整理牌的动作只需抓在手上即可,抓第二张牌时需要和第一张牌比大小。大的话直接放在第一张牌后面,小的话需插到第一张牌前面。后面抓牌时依次与前面排好序的牌比较找到合适的位置插入即可。
开始时,第一个元素在已排好序部分中,其余部分在未排序部分。然后依次从
插入排序的具体做法:在插入第i个记录时,k1,k2,k3,...,ki-1,已经排好序,将关键字ki依次与ki-1,ki-2,...,k2,k1
进行比较,从而找到应该插入的位置,然后将ki 插入,插入位置及其后的记录依次后移动。
插入排序和打扑克牌时,抓牌整理牌很相似。再抓第一张牌时,不需要进行任何整理牌的动作只需抓在手上即可,抓第二张牌时需要和第一张牌比大小。大的话直接放在第一张牌后面,小的话需插到第一张牌前面。后面抓牌时依次与前面排好序的牌比较找到合适的位置插入即可。
插入排序的基本操作为:将一个数据插入已经排好序的有序数据中。从而得到一个新的,个数加一的有序数据,算法适用于少量的数据的排序,时间复杂度为O(n^2)是稳定的排序方法
如果待排序的序列基本有序宜采用直接插入排序和冒泡排序
#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
void insert_sort(int a[],int len)
{
/*n个元素需要进行n-1趟插入排序 第一个元素a[0]相当于已经排好序的一个元素(抓第一张牌时是不需要做插入操作的),插入操作从第二个元素a[1]开始*/
for(int i=1 ;i<len;i++)
{
if(a[i]<a[i-1])//a[i]相当与新抓的一张牌需要和前一张排好序的最大的牌a[i-1]比较大小 如果新抓的牌a[i]比排好序中最大的牌a[i-1]还大,则不用进行插入操作,直接抓下一张牌
{
int temp=a[i];//相当与挖了个坑,腾出一个位置可以让a[i-1]移到这个位置
int j;
for( j=i-1;j>=0&&a[j]>temp;j--)//从后往前找合适的插入位置,找出第一个4比temp小的位置时结束for循环
{
a[j+1]=a[j];
}
a[j+1]=temp;//找到了合适的位置将新抓的牌temp 插入进去完成一趟插入排序.其实插入排序有点像快速排序中挖坑填数
}
}
}
int main()
{
int a[10];
cout<<"输入10个整数"<<endl;
for(int i=0;i<10;i++)
{
cin>>a[i];
}
insert_sort(a,10);
for(int i=0;i<10;i++)
{
cout<<a[i]<<" ,";
}
cout<<endl;
return 0;
}