您的位置:首页 > 其它

直接插入排序(递归与非递归2种实现方法)

2014-09-30 06:58 337 查看
一个数组有n个元素,假如前面n-1个元素已经排序好了,那么把第n个元素插入到前面n-1个元素,使得数组有序排列,就是插入排序了。

至于n-1个元素如何已经先排序好,那么我们可以假设前面n-2个元素已经排序好,把第n-1个元素插入到前面n-2个元素。

依次类推,直到只剩下一个元素,也就是第一个元素。排序完成。

代码如下:

#include<iostream>
using namespace std;

void Insert_Sort(int *A,int n)
{
int i,j,a;
for(i=0;i<n-1;i++)
{
j=i+1;
a=A[j];
while(a<A[j-1])
{
A[j]=A[j-1];
j--;
}
A[j]=a;
}
}

void main()
{
int A[4]={21,2,34,1};
Insert_Sort(A,4);
for (int i=0;i<4;i++)
{
cout<<A[i]<<endl;
}
system("pause");
}


附上递归版本的写法

#include<iostream>
using namespace std;

//把n插入前面已经排序好的数组
void Insert(int *a,int n)
{
int i=n-1;
int key=a
;
while((i>=0)&&key<a[i])
{
a[i+1]=a[i];
i--;
}
a[i+1]=key;

}

void Insert_Sort(int *A,int n)
{
if(n>0)
{
Insert_Sort(A,n-1); //递归表示前面已经排序好
Insert(A,n);
}
else   //递归的出口是n=0
return ;
}

void main()
{
int A[4]={21,2,34,1};
Insert_Sort(A,3);
for (int i=0;i<4;i++)
{
cout<<A[i]<<endl;
}
system("pause");
}


时间复杂度分析:

1.最好情况下,原始数据已经排序好,那么时间复杂度为O(N)

2.最坏的情况下,原始数组反向排序,此时为O(n²)

3平均情况下,O(n²)

元素数据在越接近有序的情况下,直接插入的效率越高。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: