基本的排序算法
来源:互联网 发布:php soap wsdl模式 编辑:程序博客网 时间:2024/05/09 13:21
#include <iostream>#include <cstdio>using namespace std;void BiInsertsort(int r[], int n) //折半插入排序{ for(int i=2; i<=n; i++) { if (r[i]<r[i-1]) { r[0] = r[i];//设置哨兵 int low=1,high=i-1; //折半查找 while (low<=high) { int mid=(low+high)/2; if (r[0]<r[mid]) high=mid-1; else low = mid+1; } int j; for (j=i-1; j>high; j--) r[j+1] = r[j]; //后移 r[j+1] = r[0]; } } for(int k=1; k<=n; k++) cout<<r[k]<<" "; cout<<"\n";}void Insert_sort(int r[],int n) //直接插入排序{ int i,j; for(j=1; j<n; j++) { int key=r[j]; for(i=j-1; i>=0&&r[i]>key; i--) r[i+1]=r[i]; r[i+1]=key; } for(int k=1; k<=n; k++) cout<<r[k]<<" "; cout<<"\n";}void ShellSort ( int r[], int n) //希尔排序{ for(int d=n/2; d>=1; d=d/2) //以d为增量进行直接插入排序 { for (int i=d+1; i<=n; i++) { r[0] = r[i]; //暂存被插入记录 int j; for( j=i-d; j>0 && r[0]<r[j]; j=j-d) r[j+d] = r[j]; //记录后移d个位置 r[j+d] = r[0]; } } for(int i=1; i<=n; i++) cout<<r[i]<<" "; cout<<"\n";}void BubbleSort(int r[], int n) //冒泡排序{ int temp,exchange,bound; exchange=n; //第一趟起泡排序的范围是r[0]到r[n-1] while (exchange) //仅当上一趟排序有记录交换才进行本趟排序 { bound=exchange; exchange=0; for (int j=1; j<bound; j++) //一趟起泡排序 if (r[j]>r[j+1]) { temp=r[j]; r[j]=r[j+1]; r[j+1]=temp; exchange=j; //记录每一次发生记录交换的位置 } } for(int i=1; i<=n; i++) cout<<r[i]<<" "; cout<<"\n";}int Partition(int r[], int first, int end) //快速排序一次划分{ int i=first; //初始化 int j=end; r[0]=r[first]; while (i<j) { while (i<j && r[0]<= r[j]) j--; //右侧扫描 r[i]=r[j]; while (i<j && r[i]<= r[0]) i++; //左侧扫描 r[j]=r[i]; } r[i]=r[0]; return i; //i为轴值记录的最终位置}void QuickSort(int r[], int first, int end) //快速排序{ if (first<end) { //递归结束 int pivot=Partition(r, first, end); //一次划分 QuickSort(r, first, pivot-1);//递归地对左侧子序列进行快速排序 QuickSort(r, pivot+1, end); //递归地对右侧子序列进行快速排序 }}void SelectSort(int r[ ], int n) //简单选择排序{ int i,j,index,temp; for (i=1; i<n; i++) //对n个记录进行n-1趟简单选择排序 { index=i; for (j=i+1; j<=n; j++) //在无序区中选取最小记录 if (r[j]<r[index]) index=j; if (index!=i) { temp=r[i]; r[i]=r[index]; r[index]=temp; } } for(i=1; i<=n; i++) cout<<r[i]<<" "; cout<<"\n";}int main(){ const int numv=12; int m,n,a[numv]; cout<<"请选择: 继续请按1 退出请按2 " <<endl; cin>>m; if(m==1) { cout<<"请输入11个数据:"<<endl; for(int b=1; b<numv; b++) cin>>a[b]; } while(m>0&&m<2) { cout<<"请选择排序算法:1 折半插入排序 2 希尔排序 3 冒泡排序 4 快速排序 5 简单选择排序 6直接插入排序"<<endl; cin>>n; switch(n) { case 1: { cout << "折半插入排序前:" << "\n"; for(int j=1; j<numv; j++) cout<<a[j]<<" "; cout << "\n直接插入排序结果为:" << "\n"; BiInsertsort(a,numv-1); break; } case 2: { cout << "\n希尔排序前:" << "\n"; for(int j=1; j<numv; j++) cout<<a[j]<<" "; cout << "\n希尔排序结果为:" << "\n"; ShellSort(a, numv-1); break; } case 3: { cout << "\n冒泡排序前:" << "\n"; for(int k=1; k<numv; k++) cout<<a[k]<<" "; cout << "\n冒泡排序结果为:" << "\n"; BubbleSort(a, numv-1); break; } case 4: { cout << "\n快速排序前:" << "\n"; for(int j=1; j<numv; j++) cout<<a[j]<<" "; cout << "\n快速排序结果为:" << "\n"; QuickSort(a,0,numv-1); for(int i=1; i<numv; i++) cout<<a[i]<<" "; cout<<"\n"; break; } case 5: { cout << "\n简单选择排序前:" << "\n"; for(int j=1; j<numv; j++) cout<<a[j]<<" "; cout << "\n简单选择排序结果为:" << "\n"; SelectSort(a,numv-1); break; } case 6: { cout << "直接插入排序前:" << "\n"; for(int j=1; j<numv; j++) cout<<a[j]<<" "; cout << "\n直接插入排序结果为:" << "\n"; Insert_sort(a,numv-1); break; } default: cout<<"输入错误!"<<endl; } m=0; cout<<"请选择: 继续请按1 退出请按2 " <<endl; cin>>m; } if(m==2) cout<<"OVER"<<endl; else cout<<"输入错误!"<<endl; return 0;}