1、分治法排序
#include<iostream>
using namespace std;
const int len=5;
void Merge_s(int *A,int p,int q,int r)
{
int n1=q-p+1;
int n2=r-q;
int i=0,j=0,k=0;
int L[n1+1],R[n2+1];
for(i=0;i<n1;i++)
L[i]=A[p+i];
for(j=0;j<n2;j++)
R[j]=A[q+1+j];
i=0;j=0;
for(k=0;k<n1+n2;k++)
{
if(i<n1&&j<n2)
if(L[i]<R[j])
A[k+p]=L[i++];
else
A[k+p]=R[j++];
else if(i>=n1)
A[k+p]=R[j++];
else
A[k+p]=L[i++];
}
}
void Merge_sort(int *A,int p,int r)
{
if (p<r)
{int q=(p+r)/2;//抹去小数部分,向下取整。
Merge_sort(A,p,q);
Merge_sort(A,q+1,r);
Merge_s(A,p,q,r);
}
}
int main()
{
int A[len];
for(int i=0;i<len;i++)
cin>>A[i];
Merge_sort(A,0,4);
for(int i=0;i<len;i++)
cout<<A[i];
}
2、冒泡排序
#include<iostream>
using namespace std;
const int len=5;
//冒泡排序
int main()
{
int i=0,j=0,temp=0;
int A[len];
for(i=0;i<len;i++)
{
cin>>A[i];
}
for(i=len-1;i>=1;i--)
for(j=0;j<i;j++)
{
if(A[j]>A[j+1])
{
temp=A[j];
A[j]=A[j+1];
A[j+1]=temp;
}
}
for(i=0;i<len;i++)
{
cout<<A[i];
}
}
3、插入排序
#include<iostream>
using namespace std;
const int len=5;
int main()
{
int A[len];
for(int i=0;i<len;i++)
cin>>A[i];
int i=0,j=0,key=0;
for(i=1;i<len;i++)
{
key=A[i];
j=i-1;
while(j>=0&&A[j]>key)
{
A[j+1]=A[j];
j--;
}
A[j+1]=key;
}
for(int i=0;i<len;i++)
cout<<A[i];
}
4、希尔排序
#include<iostream>
using namespace std;
int const len=10;
void shell(int *A,int d)
{
int i=0,j=0,k=0;
int key=0;
for(k=0;k<d;k++)
{
for(i=k+d;i<len;i+=d)
{
key=A[i];
j=i-d;
while(j>=k&&A[j]>key)
{
A[j+d]=A[j];
j-=d;
}
A[j+d]=key;
}
}
}
int main()
{
int A[len];
for(int i=0;i<len;i++)
cin>>A[i];
for(int d=len/2;d>0;d/=2)
{
shell(A,d);
}
for(int i=0;i<len;i++)
cout<<A[i];
}
5、快速排序
#include<iostream>
using namespace std;
int const len=10;
int part(int *A,int p,int r)
{
int key=A[r];
int i=0,j=0,temp;
i=p-1;
j=p;
for(j=p;j<r;j++)
{
if (A[j]<key)
{
temp=A[j];
A[j]=A[i+1];
A[i+1]=temp;
i++;
}
}
A[r]=A[i+1];
A[i+1]=key;
return i+1;
}
void quick(int *A,int p,int r)
{
if (p<r)
{
int q=part(A,p,r);
quick(A,p,q-1);
quick(A,q+1,r);
}
}
int main()
{
int A[len];
for(int i=0;i<len;i++)
cin>>A[i];
quick(A,0,len-1);
for(int i=0;i<len;i++)
cout<<A[i];
}
6、堆排序
#include<iostream>
using namespace std;
int const len=10;
inline int left(int i)
{
return 2*i+1;
}
inline int right(int i)
{
return 2*i+1+1;
}
void maxheapify(int *A,int i,int heapsize)//heapsize的用法
{
int l=left(i),r=right(i);
int temp=0;
int largest=i;
if(l<heapsize&&A[l]>A[i])
largest=l;
else
largest=i;
if(r<heapsize&&A[r]>A[largest])
largest=r;
if(largest!=i)
{
temp=A[i];
A[i]=A[largest];
A[largest]=temp;
maxheapify(A,largest,heapsize);
}
}
void buildheap(int *A,int heapsize)//!
{
for(int i=len/2-1;i>=0;i--)
{
maxheapify(A,i,heapsize);//!
}
}
int main()
{
int A[len];
int heapsize=0,temp=0;
for (int i=0;i<len;i++)
cin>>A[i];
heapsize=len;
buildheap(A,heapsize);
for(int i=len-1;i>=1;i--)
{
temp=A[i];
A[i]=A[0];
A[0]=temp;
heapsize-=1;
maxheapify(A,0,heapsize);
}
for (int i=0;i<len;i++)//!问题,2*0=0,2*0—+1=1.而实际应该是1和2.
cout<<A[i];
}
7、计数排序
#include<iostream>
using namespace std;
int const maxnum=20;//待排序的数组中,数字的范围为0-19
int const len=10;//数组的长度
int main()
{
int A[len],B[len],C[maxnum]={0};
for(int i=0;i<len;i++)
{
cin>>A[i];
C[A[i]]++;
}
for(int i=1;i<maxnum;i++)
{
C[i]+=C[i-1];
}
for(int i=len-1;i>=0;i--)//非常重要,一定要倒序,不然就不稳定了
{
B[C[A[i]]-1]=A[i];
C[A[i]]-=1;
}
for(int i=0;i<len;i++)
{
cout<<B[i];
}
}
8、基数排序(中间过程为计数排序)
#include<iostream>
#include<math.h>
using namespace std;
int const d=3;//待排序数组中,数字的最高位数。
int const maxnum=10;//每一位的范围为0——9。
int const len=5;//共有5个数待排序
int main()
{
int A[len],B[len],C[maxnum]={0};
int n;
for(int i=0;i<len;i++)
cin>>A[i];
for(int i=0;i<d;i++)
{
for(int j=0;j<len;j++)
{
n=int(A[j]/pow(10,i))%10;
C[n]+=1;
}
for(int j=1;j<maxnum;j++)
{
C[j]+=C[j-1];
}
for(int j=len-1;j>=0;j--)
{
n=int(A[j]/pow(10,i))%10;
B[C[n]-1]=A[j];
C[n]-=1;
}
for(int j=0;j<len;j++)
{
A[j]=B[j];
B[j]=0;
}
for(int j=0;j<maxnum;j++)
{
C[j]=0;
}
}
for(int i=0;i<len;i++)
cout<<A[i]<<' ';
}
9、桶排序
头文件:dll.h
#ifndef DLL_H_INCLUDED
#define DLL_H_INCLUDED
class dll
{
public:
dll *next;
dll *pre;
float data;
};
#endif // DLL_H_INCLUDED
主程序:
#include<iostream>
#include "dll.h"
using namespace std;
int const len=10;//待排序的数有10个
int const bnum=10;//设置10个桶
int const range=100;//待排序的数字均匀分布在1——100之间。
dll *create(float datai)
{
dll *head=new dll[1];
head->next=NULL;
head->pre=NULL;
head->data=datai;
return head;
}
void inst(dll *head,float datai)
{
dll *tail=new dll[1];
tail->next=NULL;
tail->pre=NULL;
tail->data=datai;
while(head->next!=NULL)
head=head->next;
head->next=tail;
tail->pre=head;
}
void sot(dll *head)
{
dll *p1,*p2,*nxt;
float key;
p1=head->next;
while(p1!=NULL)
{
key=p1->data;
nxt=p1;//每次的初始值不要忘记
p2=p1->pre;
while((p2!=NULL)&&(p2->data>key))
{
p2->next->data=p2->data;
nxt=p2;
p2=p2->pre;
}
nxt->data=key;
p1=p1->next;
}
}
dll *totail(dll *head)
{
while(head->next!=NULL)
head=head->next;
return head;
}
int main()
{
float A[len];
float k=range/bnum;//每个桶的宽度
int j=0;
dll *B[bnum]={NULL};
dll *head,*tail,*p;
for(int i=0;i<len;i++)
cin>>A[i];
for(int i=0;i<len;i++)
{
j=A[i]/k;
if(B[j]==NULL)
B[j]=create(A[i]);
else
inst(B[j],A[i]);
}
for(int j=0;j<bnum;j++)
{
if(B[j]!=NULL)
{
sot(B[j]);
p=B[j];//输出每个桶中的排序结果
while(p!=NULL)
{
cout<<p->data<<' ';
p=p->next;
}
cout<<endl;
}
}
j=0;
while(B[j]==NULL)
j++;
head=B[j];
tail=totail(head);
p=head;
while(p!=NULL)
{
cout<<p->data<<' ';
p=p->next;
}
cout<<endl;
for(;j<bnum;j++)
{
if(B[j]!=NULL)
{
tail->next=B[j];
B[j]->pre=tail;
tail=totail(B[j]);
p=head;//查看每次连接的结果
while(p!=NULL)
{
cout<<p->data<<' ';
p=p->next;
}
cout<<endl;
}
}
for(int i=0;i<len;i++)
{
A[i]=head->data;
head=head->next;
}
for(int i=0;i<len;i++)
cout<<A[i]<<' ';
}