插入排序

来源:互联网 发布:三类医疗器械软件价格 编辑:程序博客网 时间:2024/05/16 07:26

一、直接插入排序


#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)

是一种不稳定排序


0 0
原创粉丝点击