一、直接插入排序
#include<iostream>
using namespace std;
class Insert_sort
{
private:
int *a;
int n;
public:
Insert_sort(){}
Insert_sort(int N)
{
a=new int[N];
n=N;
}
void get()
{
int i;
for(i=0;i<n;i++)cin>>a[i];
}
void sort()
{
int i,j;
for(i=0;i<n;i++)
{
j=i;
int temp=a[i];
while(j>0&&temp<a[j-1])
{
a[j]=a[j-1];
j--;
}
a[j]=temp;
}
}
void print()
{
int i;
for(i=0;i<n;i++)cout<<a[i]<<" ";
cout<<endl;
}
};
int main()
{
int i,n;
while(cin>>n)
{
Insert_sort a(n);
a.get();
a.sort();
a.print();
}
return 0;
}
时间复杂度:o(n*n)
空间复杂度:o(1)
是一种稳定排序
二、二分插入排序(折半插入排序)
是直接插入排序的改进版
#include<iostream>
using namespace std;
class Insert_sort
{
private:
int *a;
int n;
public:
Insert_sort(){}
Insert_sort(int N)
{
a=new int[N];
n=N;
}
void get()
{
int i;
for(i=0;i<n;i++)cin>>a[i];
}
void sort()
{
int i,j;
for(i=0;i<n;i++)
{
int left=0,right=i-1;
int temp=a[i];
while(left<=right)
{
int mid=(left+right)/2;
if(temp>a[mid])left=mid+1;
else right=mid-1;
}
for(j=i;j>left;j--)a[j]=a[j-1];
a[left]=temp;
}
}
void print()
{
int i;
for(i=0;i<n;i++)cout<<a[i]<<" ";
cout<<endl;
}
};
int main()
{
int i,n;
while(cin>>n)
{
Insert_sort a(n);
a.get();
a.sort();
a.print();
}
return 0;
}
时间复杂度:o(n*n)
空间复杂度:o(1)
是一种稳定排序
是直接插入排序算法的一种更高效的改进版
#include<iostream>
using namespace std;
class Shell_sort
{
private:
int *a;
int n;
public:
Shell_sort(){}
Shell_sort(int N)
{
a=new int[N];
n=N;
}
void get()
{
int i;
for(i=0;i<n;i++)cin>>a[i];
}
void sort()
{
int step=n/2,i,j;
while(step>0)
{
for(i=step;i<n;i++)
{
int temp=a[i];
for(j=i-step;j>=0&&temp<a[j];j-=step)
{
a[j+step]=a[j];
}
a[j+step]=temp;
}
step/=2;
}
}
void print()
{
int i;
for(i=0;i<n;i++)cout<<a[i]<<" ";
cout<<endl;
}
};
int main()
{
int i,n;
while(cin>>n)
{
Shell_sort a(n);
a.get();
a.sort();
a.print();
}
return 0;
}
时间复杂度:不会算
空间复杂度:o(1)
是一种不稳定排序