順序表儲存實現氣泡排序,選擇排序,插入排序,希爾排序,基數排序
阿新 • • 發佈:2018-12-10
#include<iostream> using namespace std; const int MAXSIZE = 100; typedef int ElemType; struct Data { ElemType key; // int shu; int point; }; //Data ar[MAXSIZE], br[MAXSIZE]; int yx(int m, int i); template<class T>void bubblesort(T r[], int n); template<class T>void quicksort(T a[], int l, int h); template<class T>int hoarse(T a[], int l, int h); template<class T>void stinsort(T a[], int n); template<class T>void shellsort(T a[], int n); template<class T>int radixsort(T r[], int n); void generate(Data ary[],int count) { long int a = 1001; int i; ary[0].key=0; ary[0].point=0; for(i = 1; i<=count; i++) { a = (a*125)%5757; ary[i].key = (int)a; ary[i].point = 0; } } void prdata(Data ary[], int count) { int i; char ch; cout<<"\n 資料輸出\n"; for(i=1; i<=count; i++) cout<<"\t"<<ary[i].key; cout<<"\n\n 結束顯示"; } template<class T>void bubblesort(T r[], int n) { int i=1,tag,m; T x; do { tag = 0; x = r[i]; for(int j=n;j>i;j--) { if(r[j].key<r[j-1].key) { x = r[j]; r[j] = r[j-1]; r[j-1] = x; tag = 1; } } i++; }while(tag==1 && i<n); } template<class T>int hoarse(T a[], int l, int h) { int i,j; T x; i = l; j = h; x.key = a[i].key; do { while(i<j && a[j].key>=x.key) j--; if(i<j) { a[i].key = a[j].key; i++; } while(i<j && a[i].key<=x.key) i++; if(i<j) { a[j].key = a[i].key; j--; } }while(i<j); a[i].key = x.key; return i; } template<class T>void quicksort(T a[], int l,int h) { int i; if(l<h) { i = hoarse(a, l, h); quicksort(a,l,i-1); quicksort(a,i+1,h); } } template<class T>void stinsort(T a[], int n) { T x; for(int j=2;j<=n;j++) { bool tag = false; x.key = a[j].key; int i=1; while(tag == false &&i<j) { if(x.key>a[i].key) i++; else tag = true; } if(i<j && tag ==true) { for(int k=j-1;k>=i;k--) a[k+1]=a[k]; } a[i].key=x.key; } } template<class T>void shellsort(T a[], int n) { T x; int d[] = {8,4,2,1,0}; for(int i=0;d[i]!=0;i++) { int dd = d[i]; for(int j=0;j<=dd;j++) { /* for(int p=j;p<=n;p+=dd)*/ //{ //int pp = j; //bool tag = false; //x = a[p]; //while(pp<p && tag==false) //{ //if(a[pp].key<x.key) //pp+=dd; //else //tag = true; //} //if(pp<p) //{ //int k = p; //for(;k>pp;k-=dd) //a[k].key = a[k-dd].key; //a[k].key = x.key; //} /*}*/ for(int p=n-j;p>dd;p-=dd) { x = a[p]; int pp = p-dd; while(pp>=0 && a[pp].key>x.key) { a[pp+dd].key = a[pp].key; pp-=dd; } a[pp+dd].key = x.key; } } /* for(int j=n;j>n-dd;j--)*/ //{ //x = a[j]; //int p = j-dd; //bool tag = false; //while(p>=1 && tag==false) //{ //if(a[p].key>x.key) //{ //a[p+dd].key = a[p].key; //p-=dd; //} //else //tag = true; //if(p<j-dd) //a[p+dd].key = x.key; //} /*}*/ } } int yx(int m, int i) { int x; switch(i) { case 1: x = m%10; break; case 2: x = (m%100)/10; break; case 3: x = (m%1000)/100; break; case 4: x = (m%10000)/1000; break; default: break; } return x; } template<class T>int radixsort(T r[], int n) { int f[10],e[10]; for(int i=1;i<n;i++) r[i].point = i+1; r[n].point = 0; int p = 1; for(int i=1;i<=4;i++) { for(int j=0;j<10;j++) { f[j]=0; e[j]=0; } while(p!=0) { int k=yx(r[p].key,i); if(f[k]==0) { f[k]=p; e[k]=p; } else { int l = e[k]; r[l].point = p; e[k] = p; } p = r[p].point; } int j = 0; while(f[j]==0) j++; p = f[j]; int t = e[j]; while(j<10) { j++; while(j<10 && f[j]==0) j++; if(j<10 && f[j]!=0) { r[t].point = f[j]; t = e[j]; } r[t].point = 0; } } return p; } int main(int argc, char *argv[]) { int k,n,j,m; char ch; Data ar[MAXSIZE],br[MAXSIZE]; cout<<"\n\n 1.產生一批隨機數準備排序"; cout<<"\n 2.一般情況的氣泡排序"; cout<<"\n 3.有序情況的氣泡排序"; cout<<"\n 4.一般情況選擇排序"; cout<<"\n 5.有序情況的快速排序"; cout<<"\n 6.插入排序"; cout<<"\n 7.希爾排序"; cout<<"\n 8.基數排序"; cout<<"\n 9.結束程式"; cout<<"\n---------------------------------"; cout<<"\n 請輸入你的選擇:"; cin>>k; while(k>0&&k<9) { switch(k) { case 1: cout<<"\n資料數目:"; cin>>n; generate(ar, n); for(j=0; j<=n;j++) br[j]=ar[j]; prdata(ar,n); break; case 2: for(j=0;j<=n;j++) ar[j] = br[j]; bubblesort(ar,n); prdata(ar,n); break; case 3: bubblesort(ar,n); prdata(ar,n); break; case 4: for(j=0;j<=n;j++) ar[j]=br[j]; quicksort(ar,1,n); prdata(ar,n); break; case 5: quicksort(ar,1,n); prdata(ar,n); break; case 6: for(j=0;j<=n;j++) ar[j]=br[j]; stinsort(ar,n); prdata(ar,n); break; case 7: for(j=0;j<=n;j++) ar[j]=br[j]; shellsort(ar,n); prdata(ar,n); break; case 8: for(j=0;j<=n;j++) ar[j]=br[j]; m = radixsort(ar,n); cout<<"\n"; while(m!=0) { cout<<"\t"<<ar[m].key; m = ar[m].point; } default: break; } cout<<"\n---------------------------------"; cout<<"\n 請輸入你的選擇:"; cin>>k; } cout<<"\n\n 程式結束"; return 0; }