排序
来源:互联网 发布:淘宝发布品牌不能为空 编辑:程序博客网 时间:2024/05/02 18:31
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-19int 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_INCLUDEDclass 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]<<' ';}
- 排序
- 排序
- 排序
- 排序
- 排序
- 排序
- 排序
- 排序
- 排序
- 排序
- 排序
- 排序
- 排序
- 排序
- 排序
- 排序
- 排序
- 排序
- Android中AppWidget加载流程
- jmf不支持64位win7系统
- Lost Cows_poj_2182(线段树).java
- Service中Tomcat服务中无操作按钮,只有描述的解决方案
- opencv学习心得十----圆拟合
- 排序
- CSS实例(三):全部使用背景生成栏目
- Nginx源码解析
- 初来乍到,捣鼓捣鼓前端
- [Android] 直接获取组件的宽高:Activity.onWindowFocusChanged()
- hdu 题目1754 I Hate It (线段树,区间最大值)
- MPEG-2
- Data Structure_hdu_4217(线段树).java
- Nginx-string解析