总是记不得排序的算法,到用的时候最先想起的总是冒泡排序。唉~,所以现在总结一下常用的排序算法。 // Sort.cpp : Defines the entry point for the console application. // #include "stdafx.h" using namespace std; char data[10]={'8','4','9','0','2','3','6','1','7','5'}; //store the data to sort; char dataM[10]; char dataQ[10]; char dataH[10]; int _tmain(int argc, _TCHAR* argv[]) { void BubbleSort(char a[10]); //冒泡排序; void ExchangeSort(char a[10]);//交换排序; void SelectionSort(char a[10]);//选择排序; void InsertSort(char a[10]);//插入排序; void ShellSort(char a[10]);//希尔排序; void Merge(char(&a)[10],int first,int mid,int last); void MergeSort(char (&a)[10],int begin,int end);//归并排序; int Partition(char (&a)[10],int low,int high); void QuickSort(char (&a)[10],int low,int high);//快速排序; void AjustHeap(char (&a)[10],int begin,int length); void HeapSort(char (&a)[10],int b);//堆排序; cout<<"你要排序的数为:"<<"/n"; for(int j=0;j<10;++j)cout<<data[j]; cout<<'/n'; BubbleSort(data); ExchangeSort(data); SelectionSort(data); InsertSort(data); ShellSort(data); for(int i=0;i<10;++i)dataM[i]=data[i]; MergeSort(dataM,0,9); cout<<"归并排序的结果:"<<'/n'; for(int x=0;x<10;++x)cout<<dataM[x]<<'/t'; cout<<'/n'; for(int y=0;y<10;++y)dataQ[y]=data[y]; QuickSort(dataQ,0,9); cout<<"快速排序的结果:"<<'/n'; for(int z=0;z<10;++z)cout<<dataQ[z]<<'/t'; cout<<'/n'; for(int m=0;m<10;++m)dataH[m]=data[m]; HeapSort(dataH,10); cout<<"堆排序的结果:"<<'/n'; for(int n=0;n<10;++n)cout<<dataH[n]<<'/t'; cout<<'/n'; //RadixSort(data); system("pause"); return 0; } //冒泡排序; void BubbleSort(char a[10]) { char b[10]={'/0'}; int c=0; int n=10; char temp='/0'; for(int i=0;i<n;++i)b[i]=a[i]; for(int x=n-1;x>1;--x) { for(int y=0;y<x;++y) { if(b[y]>b[y+1]) { ++c; temp=b[y]; b[y]=b[y+1]; b[y+1]=temp; } } } cout<<"冒泡排序的结果:"<<'/n'; for(int j=0;j<n;++j)cout<<b[j]<<'/t'; cout<<"/n"; cout<<"运算次数为:"<<'/t'<<c<<'/n'; cout<<'/n'; } //交换排序; void ExchangeSort(char a[10]) { char b[10]={'/0'}; int c=0; int n=10; char temp='/0'; for(int i=0;i<n;++i)b[i]=a[i]; for(int x=0;x<n-1;++x) { for(int y=x+1;y<n;++y) { if(b[x]>b[y]) { ++c; temp=b[x]; b[x]=b[y]; b[y]=temp; } } } cout<<"交换排序的结果:"<<'/n'; for(int j=0;j<n;++j)cout<<b[j]<<'/t'; cout<<"/n"; cout<<"运算次数为:"<<'/t'<<c<<'/n'; cout<<'/n'; } //选择排序; void SelectionSort(char a[10]) { char b[10]={'/0'}; int c=0; int n=10; char min='/0'; int temp=0; for(int i=0;i<n;++i)b[i]=a[i]; for(int x=0;x<n-1;++x) { min=b[x]; temp=x; for(int y=x+1;y<n;++y) { if(b[y]<min) { ++c; min=b[y]; temp=y; } } b[temp]=b[x]; b[x]=min; } cout<<"选择排序的结果:"<<'/n'; for(int j=0;j<n;++j)cout<<b[j]<<'/t'; cout<<'/n'; cout<<"运算次数为:"<<'/t'<<c<<'/n'; cout<<'/n'; } //插入排序; void InsertSort(char a[10]) { char b[10]={'/0'}; int c=0; int n=10; char temp='/0'; int y=0; for(int i=0;i<n;++i)b[i]=a[i]; for(int x=1;x<n;++x) { temp=b[x]; y=x-1; while((y>=0)&&(b[y]>temp)) { b[y+1]=b[y]; --y; } b[y+1]=temp; ++c; } cout<<"插入排序的结果:"<<'/n'; for(int j=0;j<n;++j)cout<<b[j]<<'/t'; cout<<'/n'; cout<<"运算次数为:"<<'/t'<<c<<'/n'; cout<<'/n'; } //希尔排序; void ShellSort(char a[10]) { char b[10]={'/0'}; int c=0; int n=10; char temp='/0'; int h=0; int y=0; for(int i=0;i<n;++i)b[i]=a[i]; h=n/2; while(h>0) { for(int x=0;x<n;++x) { temp=b[x]; y=x-h; while(y>=0&&b[y]>temp) { b[y+h]=b[y]; y=y-h; } b[y+h]=temp; ++c; } h=h/2; } cout<<"希尔排序的结果:"<<'/n'; for(int j=0;j<n;++j)cout<<b[j]<<'/t'; cout<<'/n'; cout<<"运算次数为:"<<'/t'<<c<<'/n'; cout<<'/n'; } void Merge(char(&a)[10],int first,int mid,int last) { char *temp=new char[last-first+1]; int begin1=first; int end1=mid; int begin2=mid+1; int end2=last; int x=0; while((begin1<=end1)&&(begin2<=end2)) { if(a[begin1]<a[begin2])temp[x]=a[begin1++]; else temp[x]=a[begin2++]; ++x; } while(begin1<=end1)temp[x++]=a[begin1++]; while(begin2<=end2)temp[x++]=a[begin2++]; for(int i=0;i<(last-first+1);++i)a[i+first]=temp[i]; delete temp; } //归并排序; void MergeSort(char (&a)[10],int begin,int end) { int mid=0; if(end>begin) { mid=(begin+end)/2; MergeSort(dataM,begin,mid); MergeSort(dataM,mid+1,end); Merge(dataM,begin,mid,end); } } int Partition(char (&a)[10],int low,int high) { int pivotkey=a[low]; while(low<high) { while((low<high)&&(pivotkey<=a[high]))--high; a[low]=a[high]; while((low<high)&&(pivotkey>=a[low]))++low; a[high]=a[low]; } a[low]=pivotkey; return low; } //快速排序 void QuickSort(char (&a)[10],int low,int high) { if(low<high) { int i=Partition(dataQ,low,high); QuickSort(dataQ,low,i-1); QuickSort(dataQ,i+1,high); } } void AjustHeap(char (&a)[10],int begin,int length) { while((2*begin+1)<length) { int maxchild=2*begin+1; if((2*begin+2)<length) { if(a[2*begin+2]>a[2*begin+1])maxchild=2*begin+2; } if(a[begin]<a[maxchild]) { char tmpchild=a[begin]; a[begin]=a[maxchild]; a[maxchild]=tmpchild; begin=maxchild; } else break; } } //堆排序; void HeapSort(char (&a)[10],int b) { char tmp; for(int i=(b-1)/2;i>=0;--i) { AjustHeap(a,i,b); } for(int j=b-1;j>0;--j) { tmp=a[0]; a[0]=a[j]; a[j]=tmp; AjustHeap(a,0,j); } }