@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@直接插入排序@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
#include<cstdlib>
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
void Swap (int T[],int a);
int main()
{
int n;
cin>>n;
int T[n];
for(int i=0;i<n;cin>>T[i],i++);
for(int i=1;i<n;i++)
{
Swap(T, i);
for(int i=0;i<n;cout<<T[i]<<" ",i++);
cout<<endl;
}
}
void Swap (int T[],int a)
{
int n=a-1;
int i,j=T[a];
for( i=n;i>=0;i--)
{
if(T[i]>j) T[i+1]=T[i];
else break;
}
if(i!=n) T[i+1]=j;
}
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@直接插入排序@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@二叉法插入排序@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
int Find(int T[],int n)
{
int a=1,b=n-1; //A.B搞混;
T[0]=T[n];
while(a!=b)
{
if(T[(a+b)/2]>=T[0]&&T[(a+b)/2-1]<=T[0])
a=b=(a+b)/2;
else if(T[(a+b)/2]<T[0]) a=(a+b)/2+1;
else if(T[(a+b)/2]>T[0]) b=(a+b)/2-1 ;
}
for(int i=n;i>a;i--)
T[i]=T[i-1];
T[a]=T[0];
}
int main()
{
int n;
cin>>n;
int T[n+1];
for(int i=1;i<=n;i++)
cin>>T[i];
for(int i=2;i<=n;i++)
{
if(T[i]<T[i-1])
{
Find(T,i);
}
for(int i=1;i<=n;i++)
printf("%d ",T[i]);
printf("\n");
}
}
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@二叉法插入排序@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@希尔排序@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
void display(int T[],int n)
{
for(int i=1;i<=n;i++)
cout<<T[i]<<" ";
cout<<endl;
}
int main()
{
int n;
cin>>n;
int T[n+1],increment=n;
for(int i=1;i<=n;i++)
cin>>T[i];
do
{
increment=increment/2;
for(int i=increment+1;i<=n;i++)
{
if(T[i]<T[i-increment])
{
T[0]=T[i];
int j;
for( j=i-increment;j>0;j-=increment)
{
T[j+increment]=T[j];
if(T[0]>=T[j]) break;
}
T[j+increment]=T[0];
}
}
display(T,n);
} while(increment>1) ;
}
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@快速排序 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
int n; //写个不好 没有优化 用于display 中 说明数组大小
struct So
{
int size ;
int *L;
};
void display(int T[])
{
for(int i=1;i<=n;i++)
cout<<T[i]<<" ";
cout<<endl;
}
int Partition(int T[],int low ,int high)
{
int j=low;
T[0]=T[low];
while (low<high)
{
for(;T[high]>=T[0]&&high!=low;high--);
T[j]=T[high];
j=high;
for(;T[low]<=T[0]&&high!=low;low++);
T[j]=T[low];
j=low;
}
T[low]=T[0];
display(T);
return low;
}
void Sort(int T[],int low,int high)
{
if(low>=high) return ; //很重要 因为有可能 low>high ,因为如果Sort未排序 则pivotkey=high;
int pivotkey;
pivotkey=Partition(T,low,high);
Sort(T,low,pivotkey-1); //如果pivotkey=low 则pivotkey-1<low
Sort(T,pivotkey+1,high);
}
void Quick (So T)
{
Sort(T.L,1,T.size);
}
int main()
{
So T;
cin>>T.size;
n=T.size;
T.L=new int [T.size+1];
for(int i=1;i<=T.size;i++)
cin>>T.L[i];
Quick(T);
}
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@堆排序 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
using namespace std;
int n; //写个不好 没有优化 用于display 中 说明数组大小
struct So
{
int size ;
int *L;
};
void display(int T[])
{
for(int i=1;i<=n;i++)
cout<<T[i]<<" ";
cout<<endl;
}
void heapsort(int T[],int s,int m)
{
int temp=T[s];
for(int j=2*s;j<=m;j=2*j)
{
if(j<m&&T[j]<T[j+1]) j++;//把 m写成n 使 方程不正确,因为 m 时刻变化 而n 不变。
if(T[j]<=temp) break;
T[s]=T[j];
s=j;
}
T[s]=temp;
}
int main()
{
So T;
cin>>T.size;
n=T.size;
T.L=new int [T.size+1];
for(int i=1;i<=T.size;i++)
cin>>T.L[i];
for(int i=n/2;i>0;i--)
heapsort(T.L,i,n);
for(int i=n;i>1;i--)
{
swap(T.L[1],T.L[i]);
heapsort(T.L,1,i-1);
}
display(T.L);
}
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@堆排序 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
using namespace std;
int N;
void Merge(int A[],int B[],int m,int s,int n)
{
int enda=s,endb=n,i=m; s++;
while(m<=enda&&s<=endb)
{
if(B[m]<=B[s]) A[i++]=B[m++];
else A[i++]=B[s++];
}
if(m<=enda) for(;i<=n;) A[i++]=B[m++];
else for(;i<=n;) A[i++]=B[s++];
}
void MSort(int sr[],int th1[],int m,int n)
{
if(m==n) th1[m]=sr[m];
else //th1 是另一个的 th2 ;
{
int th2[N];
int s=(m+n)/2 ;
MSort(sr,th2,m,s);
MSort(sr,th2,s+1,n);
Merge(th1,th2,m,s,n);
}
}
int main()
{
int n;
cin>>n;
N=n+1;
int T[n+1],S[n+1];
for(int i=1;i<=n;i++)
cin>>T[i];
MSort(T,S,1,n);
for(int i=1;i<=n;i++)
cout<<S[i]<<" ";
cout<<endl;
}
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@归并排序 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
using namespace std;
int N;
void Merge(int A[],int B[],int m,int s,int n)
{
int enda=s,endb=n,i=m; s++;
while(m<=enda&&s<=endb)
{
if(B[m]<=B[s]) A[i++]=B[m++];
else A[i++]=B[s++];
}
if(m<=enda) for(;i<=n;) A[i++]=B[m++];
else for(;i<=n;) A[i++]=B[s++];
}
void MSort(int sr[],int th1[],int m,int n)
{
if(m==n) th1[m]=sr[m];
else //th1 是另一个的 th2 ;
{
int th2[N];
int s=(m+n)/2 ;
MSort(sr,th2,m,s);
MSort(sr,th2,s+1,n);
Merge(th1,th2,m,s,n);
}
}
int main()
{
int n;
cin>>n;
N=n+1;
int T[n+1],S[n+1];
for(int i=1;i<=n;i++)
cin>>T[i];
MSort(T,S,1,n);
for(int i=1;i<=n;i++)
cout<<S[i]<<" ";
cout<<endl;
}
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@非递归 归并排序 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
using namespace std;
int N;
void display(int T[])
{
for(int i=1;i<=N;i++)
cout<<T[i]<<" ";
cout<<endl;
}
void Merge(int A[],int B[],int m,int s,int n)
{
int enda=s,endb=n,i=m; s++;
while(m<=enda&&s<=endb)
{
if(B[m]<=B[s]) A[i++]=B[m++];
else A[i++]=B[s++];
}
if(m<=enda) for(;i<=n;) A[i++]=B[m++];
else for(;i<=n;) A[i++]=B[s++];
}
void Mergepass(int SR[],int TR[],int s,int n)
{
int i=1,j=n/2/s;
while(j--)
{
Merge(TR,SR,i,i+s-1,i+2*s-1);
i=i+2*s;
}
if(i<n-s+1) Merge(TR,SR,i,i+s-1,n); //三种情况 一种 是正好 2S 的倍数 第二种是余S+k(0<k<S) 第三种 就是 2*S+K(0<K<S);
else for(j=i;j<=n;j++) TR[j]=SR[j] ;
display(TR);
}
void MSort (int T[],int length)
{
int k=1;
int th[length+1];
while(k<length)
{
Mergepass(T,th,k,length);
k*=2;
if(k>=length) break;
Mergepass(th,T,k,length);
k*=2;
}
}
int main()
{
int n;
cin>>n;
N=n;
int T[n+1];
for(int i=1;i<=n;i++) cin>>T[i] ;
MSort(T,n) ;
}
各种排序算法
最新推荐文章于 2024-10-22 17:17:53 发布