内部排序H

  1 #include<stdio.h>
  2 #include<math.h>
  3 #include<iostream.h>
  4 #include<stdlib.h>
  5 #define OK 1
  6 #define FALSE 0
  7 #define MAX_NUM 100
  8 typedef int Status;
  9 typedef int ElemType;
 10 typedef struct SqList
 11 {
 12     ElemType r[MAX_NUM];
 13     int length;
 14 }SqList;
 15 typedef SqList HeapType;
 16 Status Exchange(ElemType &a,ElemType &b)
 17 {
 18     ElemType t;
 19     t=a;a=b;b=t;
 20     return OK;
 21 }
 22 //直接插入排序 
 23 Status InsertSort(SqList &L)
 24 {
 25     int i,j;
 26     for(i=2;i<=L.length;i++)
 27         if(L.r[i]<L.r[i-1])
 28         {
 29             L.r[0]=L.r[i];
 30             L.r[i]=L.r[i-1];
 31             for(j=i-1;L.r[0]<L.r[j];j--)
 32                 L.r[j+1]=L.r[j];
 33             L.r[j+1]=L.r[0];
 34         }
 35         return OK;
 36 }
 37 //希尔排序
 38 void ShellInsert(SqList &L,int dk)
 39 {
 40     int i,j;
 41     for(i=dk+1;i<=L.length;i++)
 42         if(L.r[i]<L.r[i-dk])
 43         {
 44             L.r[0]=L.r[i];
 45             for(j=i-dk;j>0&&L.r[0]<L.r[j];j-=dk)
 46                 L.r[j+dk]=L.r[j];
 47             L.r[j+dk]=L.r[0];
 48         }
 49 } 
 50 Status ShellSort(SqList &L)
 51 {
 52     int i,j,t,n,dlta[10];
 53     n=log(L.length)/log(2);
 54     printf("请输入你要排序的趟数(系统将根据相关规则定义递增序列,但不能大于%d):\n",n); 
 55     cin>>t;
 56     for(j=1,i=t-1;i>=0;i--,j<<=1)
 57         dlta[i]=j+1;
 58     dlta[t-1]--;
 59     for(i=0;i<t;i++)
 60         ShellInsert(L,dlta[i]);
 61     return OK;
 62 }
 63 //冒泡排序 
 64 Status  MPSort(SqList &L)
 65 {
 66     int i,j;
 67     for(i=1;i<L.length;i++)
 68         for(j=1;j<L.length;j++)
 69             if(L.r[j]>L.r[j+1])
 70             Exchange(L.r[j],L.r[j+1]);
 71     return OK;
 72 }
 73 //快速排序
 74 int Partition(SqList &L,int low,int high)
 75 {
 76     int pivotkey=L.r[low];
 77     L.r[0]=L.r[low];
 78     while(low<high)
 79     {
 80         while(low<high&&L.r[high]>=pivotkey) high--;
 81         L.r[low]=L.r[high];
 82         while(low<high&&L.r[low]<=pivotkey) low++;
 83         L.r[high]=L.r[low];
 84     }
 85     L.r[low]=L.r[0];
 86     return low;
 87 }
 88 void Qsort(SqList &L,int low,int high)
 89 {
 90     if(low<high)
 91     {
 92         int pivotloc=Partition(L,low,high);
 93         Qsort(L,low,pivotloc-1);
 94         Qsort(L,pivotloc+1,high);
 95     }
 96 }
 97 Status QuickSort(SqList &L)
 98 {
 99     Qsort(L,1,L.length);
100     return OK;
101 } 
102 //简单选择排序 
103 int SelectMinKey(SqList L,int i)
104 {
105     int k;
106     for(k=i;i<L.length;)
107     if(L.r[k]>L.r[++i])
108     k=i;
109     return k;
110 }
111 Status SelectSort(SqList &L)
112 {
113     int i,j;
114     for(i=1;i<L.length;i++)
115     {
116         j=SelectMinKey(L,i);
117         if(i!=j) Exchange(L.r[i],L.r[j]);
118     }
119     return OK;
120 }
121 //堆排序
122 typedef SqList HeapType;
123 void HeapAdjust(HeapType &H,int s,int m)
124 {
125     int j;
126     ElemType rc=H.r[s];
127     for(j=2*s;j<=m;j*=2)
128     {
129         if(j<m&&H.r[j]<H.r[j+1]) j++;
130         if(rc>=H.r[j]) break;
131         H.r[s]=H.r[j];
132         s=j;
133     }
134     H.r[s]=rc;    
135 } 
136 Status HeapSort(HeapType &H)
137 {
138     int i;
139     for(i=H.length/2;i>0;i--)
140         HeapAdjust(H,i,H.length);
141     for(i=H.length;i>1;i--)
142     {
143         Exchange(H.r[1],H.r[i]);
144         HeapAdjust(H,1,i-1);
145     }
146     return OK;
147 }
148 //归并排序
149 void Merge(ElemType SR[],ElemType TR[],int i,int m,int n)
150 {
151     int j,k;
152     for(j=m+1,k=i;i<=m&&j<=n;k++)
153     {
154         if(SR[i]<SR[j]) TR[k]=SR[i++];
155         else TR[k]=SR[j++];
156     }
157     while(i<=m) TR[k++]=SR[i++];
158     while(j<=n) TR[k++]=SR[j++];
159 } 
160 void MSort(ElemType SR[],ElemType TR1[],int s,int t)
161 {
162     int m;
163     ElemType TR2[MAX_NUM];
164     if(s==t) TR1[s]=SR[s];
165     else 
166     {
167         m=(s+t)/2;
168         MSort(SR,TR2,s,m);
169         MSort(SR,TR2,m+1,t);
170         Merge(TR2,TR1,s,m,t);
171     }
172 }
173 Status MergeSort(SqList &L)
174 {
175     MSort(L.r,L.r,1,L.length);
176     return OK;
177 }
178 //主函数 
179 Status main()
180 {
181     SqList L;
182     int i,t,d;
183 loop:puts("请输入待排序数组的元素个数:");
184     cin>>L.length;
185     puts("请输入你要排序的数组:");
186     for(i=1;i<=L.length;i++)
187     cin>>L.r[i];
188     puts("请选择你想要使用的排序方式:1.直接插入排序,2.希尔排序,3.冒泡排序,\n4.快速排序,5.简单选择排序,6.堆排序,7.归并排序 :");
189     cin>>t;
190     switch(t)
191     {
192         case 1:InsertSort(L);break;
193         case 2:ShellSort(L);break;
194         case 3:MPSort(L);break;
195         case 4:QuickSort(L);break;
196         case 5:SelectSort(L);break;
197         case 6:HeapSort(L);break;
198         case 7:MergeSort(L);
199     }
200     puts("排序后结果为:");
201     for(i=1;i<=L.length;i++)
202     printf("%-3d",L.r[i]);
203     putchar('\n');
204     puts("你想要退出程序吗?(Y/N)");
205     getchar();
206     if(getchar()=='N')
207     {
208         system("CLS");
209         goto loop;
210     }
211     system("pause");
212     return OK;
213 }

posted on 2012-08-03 08:21  mycapple  阅读(340)  评论(0编辑  收藏  举报

导航