前言
重新温习数据结构与算法,对一些常用的算法进行代码实现。
一、直接插入排序
1. 代码实现
#include<bits/stdc++.h>
using namespace std;
#define maxSize 100
typedef struct
{
int Elem[maxSize];
int length;
}SqList;
void sortCP(SqList &ql)
{
int i=0,j=0;
for(i=2;i<ql.length;i++)
{
if(ql.Elem[i]<ql.Elem[i-1])
{
ql.Elem[0] = ql.Elem[i];
for(j=i-1;ql.Elem[j]>ql.Elem[0];--j)
{
ql.Elem[j+1] = ql.Elem[j];
}
ql.Elem[j+1] = ql.Elem[0];
}
}
}
int main()
{
SqList QL;
QL.length = 8;
for(int i=1;i<=QL.length;++i)
{
cin>>QL.Elem[i];
}
cout<<"插入前元素:";
for(int i=1;i<=QL.length;++i)
{
cout<<QL.Elem[i]<<" ";
}
sortCP(QL);
cout<<endl;
cout<<"插入后元素:";
for(int i=1;i<=QL.length;++i)
{
cout<<QL.Elem[i]<<" ";
}
return 0;
}
2. 运行结果
二、折半插入排序
1.代码实现
#include<bits/stdc++.h>
using namespace std;
#define maxSize 100
typedef struct
{
int Elem[maxSize];
int length;
}SqList;
void sortCP(SqList &ql)
{
int i=0,j=0;
for(i=2;i<=ql.length;++i)
{
ql.Elem[0] = ql.Elem[i];
int low = 1;
int high = i-1;
while(low<=high)
{
int mid = (low+high)/2;
if(ql.Elem[i]<ql.Elem[mid])
high = mid-1;
else
low =mid+1;
}
for(j=i-1;j>=high+1;--j)
ql.Elem[j+1] = ql.Elem[j];
ql.Elem[high+1] = ql.Elem[0];
}
}
int main()
{
SqList QL;
QL.length = 8;
for(int i=1;i<=QL.length;++i)
{
cin>>QL.Elem[i];
}
cout<<"插入前元素:";
for(int i=1;i<=QL.length;++i)
{
cout<<QL.Elem[i]<<" ";
}
sortCP(QL);
cout<<endl;
cout<<"插入后元素:";
for(int i=1;i<=QL.length;++i)
{
cout<<QL.Elem[i]<<" ";
}
return 0;
}
2.运行结果
三、希尔插入排序
1.代码实现
#include<bits/stdc++.h>
using namespace std;
#define maxSize 100
typedef struct
{
int Elem[maxSize];
int length;
}SqList;
void ShellInsert(SqList &ql,int dk)
{
int i=0,j=0;
for(i=dk+1;i<=ql.length;++i)
{
if(ql.Elem[i]<ql.Elem[i-dk])
{
ql.Elem[0] = ql.Elem[i];
for(j=i-dk;j>0&&ql.Elem[0]<ql.Elem[j];j=j-dk)
{
ql.Elem[j+dk] = ql.Elem[j];
}
ql.Elem[j+dk] = ql.Elem[0];
}
}
}
void ShellSort(SqList &ql,int dlta[],int t)
{
for(int k=0;k<t;k++)
{
ShellInsert(ql,dlta[k]);
}
}
int main()
{
SqList QL;
QL.length = 8;
for(int i=1;i<=QL.length;++i)
{
cin>>QL.Elem[i];
}
cout<<"插入前元素:";
for(int i=1;i<=QL.length;++i)
{
cout<<QL.Elem[i]<<" ";
}
int dlta[3]={5,3,1};
ShellSort(QL,dlta,3);
cout<<endl;
cout<<"插入后元素:";
for(int i=1;i<=QL.length;++i)
{
cout<<QL.Elem[i]<<" ";
}
return 0;
}
2.运行结果
总结
- 用哨兵进行当前元素的保存与比较,将其放在数组下标为0的位置,以便于进行遍历和比较操作。
- 折半插入排序相较于直接插入排序,主要区别在于查找部分的不同。
- 希尔排序相较于直接插入排序,直接插入排序是以步长为1进行遍历查找以及排序的。而希尔排序是按照事先给定的序列作为步长进行多次插入排序。