您的位置:首页 > 编程语言 > C语言/C++

排序算法C++ && Python实现---直接插入排序

2017-04-26 15:30 295 查看
算法思想:

直接插入排序的思想是:从待排序序列的第一个元素开始,依次比较相邻的两个元素,若后者小于前者(从小到大排序),则将后者作为哨兵,插入到序列中的正确位置。

那么问题来了,怎么样才能将哨兵插入到正确的位置呢?这就是下面需要着重解决的问题。

考虑,第i个元素作为哨兵,则意味着data[i-1]>data[i]的,且经过前面的排序后,前面的0~i-1个元素已经从小到大排好序了。那么,可以从第i-1个元素开始,向序列首部方向,依次比较与哨兵的大小,若大于哨兵,则向后移动一个单位,如小于哨兵,则将哨兵插入到此元素之后。

C++实现(IDE: VS2012)

//打印排序结果函数
void Print(int a[],int n,int i=0)
{
//cout<<i<<endl;
cout<<"排序后的结果为:"<<endl;
for(int i=0;i<n;i++)
cout<<a[i]<<" ";
cout<<endl;
}
//插入排序---直接插入排序,时间复杂度O(N^2)
void ZhiJieChaRuPaiXu(int a[8],int n)  //函数输入参数---数组a中存有待排序数据,n为数据个数
{
for(int i=1;i<n;i++)               //待排序数组长度为n
{
if(a[i]<a[i-1]){
int j=i-1;
int x=a[i];                //复制哨兵,将参考值保存
while(x<a[j])              //判断坐标i之前的每个数值,若大于参考值
{
a[j+1]=a[j];           //将值向前移动
j--;                   //坐标值前移
}
a[j+1]=x;                  //若第j个数据不再小于参考值,则将参考值插入到j+1位置
}
Print(a,n,i);
}
}


3 Python实现(Python 2.7)

'''输出排序结果函数'''
def Print(ddata):
n=len(ddata)
for i in range(n):
print ddata[i],    #其中","为了不让其输出默认的换行符
'''插入排序---直接插入排序'''
def ZhiJieChaRuPaiXu(data):
n=len(data)
for i in range(1,n):
if(data[i]<data[i-1]):
ShaoBing=data[i]
j=i-1
while(ShaoBing<data[j]):      #每次移动一个数据
data[j+1]=data[j]
j=j-1
if(j==-1):                #当j为-1时,表明ShaoBing为最小元素,
data[0]=ShaoBing
break
data[j+1]=ShaoBing
Print(data)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息