排序算法的一点总结

  1 #include <string>
  2 #include <list>
  3 #include <vector>
  4 #include <deque>
  5 #include <iomanip>
  6 #include <iostream>
  7 
  8 void display(int *a,int n)
  9 {//n为数组个数
 10     for(int i=0;i<n;++i)
 11     {
 12         cout <<setw(3)<< a[i]<<"#";
 13     }
 14     cout << endl;
 15 }
 16 void InsertSort(int *a,int n)
 17 {//直接插入排序,n为数组个数
 18     int i,j,k;
 19     for(i=1;i<n;++i)
 20     {
 21         for(j=i-1,k=a[i];j>=0&&k<a[j];--j)
 22         {
 23             a[j+1]=a[j];
 24         }
 25         a[j+1]=k;
 26 //         display(a,16);
 27 //         system("pause");
 28     }
 29 }
 30 void ShellSort(int *a,int n)
 31 {//直接插入排序的改进版,n为数组个数
 32     int d,i,j,m,k;
 33     d=8;//增量
 34     while(d>0)
 35     {
 36         m=0;
 37         while(m<d)//分成d个组后对每个组进行直接插入排序
 38         {
 39             for(i=m+d;i<n;i+=d)//这里等价于普通插入算法的i=1;当然你写i=m其实也一样,
 40             {                    //在内部for循环会判断出界的。
 41                 k=a[i];
 42                 for(j=i-d;j>=0&&k<a[j];j-=d)
 43                 {
 44                     a[j+d]=a[j];
 45                 }
 46                 a[j+d]=k;
 47             }
 48             ++m;//是插入算法的操作对象为下个组
 49         }
 50         d/=2;
 51     }
 52 }
 53 void Bubble1Sort(int *a,int n)
 54 {//冒泡排序,n为数组个数
 55     int i,j,t;
 56     for(i=1;i<n;++i)//做n-1趟冒泡处理
 57     {
 58         for(j=0;j<n-i;++j)
 59         {
 60             if(a[j]>a[j+1])
 61             {
 62                 t=a[j+1];
 63                 a[j+1]=a[j];
 64                 a[j]=t;
 65             }
 66         }
 67         display(a,n);
 68         system("pause");
 69     }
 70 }
 71 void BubbleSort(int* a,int n)//n为数组个数
 72 {//改进思想:在每一躺比较中,当比较结束后,如果发现从某个
 73 //位置t开始,不再进行交换,说明从a[t+1]到a[n-1]已经排序完成了,从而下一躺比较
 74 //只要进行到位置t即可。
 75     
 76     int i,t,border;
 77     border=n-1;
 78     while (border>0)
 79     {
 80         t=0;
 81         for (i=0;i<border;++i)//这里表明a[border+1]到a[n-1]都不用排序了
 82         {                       //i最大值为i=border-1;由于if(a[i]>[i+1])    
 83             if (a[i]>a[i+1])  //所以初始化为border=n-1,不然会在第一躺的时候
 84             {                  //出现读取超界
 85                 t=a[i];
 86                 a[i]=a[i+1];
 87                 a[i+1]=t;
 88                 t=i;//不断更新边界值
 89             }
 90         }
 91         border=t;
 92         display(a,n);
 93     }
 94     //在我给定的a[N]中,BubbleSort只需要冒泡9次就排序完毕了,而Bubble1Sort
 95     //不管初始数据怎样有序无序,都需要冒泡N-1次才退出,所以还是这个智能
 96 }
 97 void QuickSort(int* a,int m,int n) 
 98 {//这里的m,n是代表索引能够取到的值;
 99     if(m>=n) //递归出口
100         return;
101     int i,j,k,t;
102     i=m;j=n+1;
103     k=a[m];
104     while(i<j)
105     {
106         i++;
107         while(k>a[i])
108             ++i;
109         j--;
110         while(k<a[j])
111             --j;
112         if(i<j)
113         {
114             t=a[i];
115             a[i]=a[j];
116             a[j]=t;
117         }
118     }
119     t=a[j];
120     a[j]=a[m];
121     a[m]=t;
122     QuickSort(a,m,j-1);
123     QuickSort(a,j+1,n);
124 }
125 void BubbleUpDownSort(int* a,int n)//n为数组个数
126 {//交替冒泡排序算法
127 //先冒泡,再下沉,再冒泡,反复交替,直到两个边界相交,说明排序结束
128 //一般情况下会由于单纯的冒泡,特殊?我下面给了另外一个有规律的数组,得15次才行
129     int bu,bd,i,k,t,j;
130     bu=n-1;bd=0;i=0;
131     while (bu>bd)
132     {
133         if(0==i)
134         {
135             t=0;
136             for(j=0;j<bu;++j)
137             {
138                 if (a[j]>a[j+1])
139                 {
140                     k=a[j];
141                     a[j]=a[j+1];
142                     a[j+1]=k;
143                     t=j;
144                 }
145             }
146             bu=t;i=1;
147             display(a,n);
148         }
149         else
150         {
151             t=0;
152             for(j=n-1;j>bd;--j)
153             {
154                 if (a[j]<a[j-1])
155                 {
156                     k=a[j];
157                     a[j]=a[j-1];
158                     a[j-1]=k;
159                     t=j;
160                 }
161             }
162             bd=t;i=0;
163             display(a,n);
164         }
165     }
166 
167 }
168 void SelectSort(int* a,int n)//n为数组个数
169 {//直接选择排序算法:核心思想是第i次操作选择第i小的记录放在第i个位置上
170     int k,i,j,t;
171     for(i=1;i<n;i++)
172     {
173         k=i-1;
174         for (j=i;j<n;++j)
175             if(a[k]>a[j])
176                 k=j;
177         t=a[k];
178         a[k]=a[i-1];
179         a[i-1]=t;
180     }
181 }
182 void Restore(int* a,int mm,int n)
183 {//重建树根为a[m]的二叉树,使之满足堆的特性。a[m]的左右子树是堆,且
184 //a[m]为根的树的任意节点的编号均不大于n。m,n都为索引可取值
185 //这里编号为索引号,也是完全二叉树的编号,由0开始
186 //如果a[i]是根,则a[2i+1]是它的左儿子,a[2i+2]是右儿子,当然是存在的条件下
187     int j,k,t;
188     j=mm;
189     while(j<=(n+1)/2-1)// (n+1)/2-1是有子节点的父节点的最大编号
190     {
191         if(2*j+1<n && a[2*j+1]<a[2*j+2])//如果2*j+1<n则说明一定有右儿子
192             k=j+j+2;
193         else 
194             k=j+j+1;
195         if(a[k]>a[j])
196         {//其实下面j=m想当于递归重建上面被交换的堆,使之保持堆的性质
197             t=a[k];a[k]=a[j];a[j]=t;j=k;
198         }
199         else
200             j=n;//出口,也可直接break;
201     }
202 }
203 void HeapSort(int* a,int n)
204 {//n为数组个数
205     int i,t;
206     for(i=n/2-1;i>=0;--i)
207     {//初始建堆,从有子节点的父节点的最大编号开始,依次递减,利用Restore()
208         Restore(a,i,n-1);
209     }
210     for(i=n-1;i>=0;--i)//开始堆排序了
211     { 
212         t=a[0];
213         a[0]=a[i];
214         a[i]=t;
215         Restore(a,0,i-1);
216     }
217 }
218 const int N=16;
219 const int M=10;
220 int a[N]={7,2,9,1,16,4,15,5,10,6,3,8,10,12,14,13};
221 int m[M]={26,5,77,1,61,11,59,15,48,19};
222 //int a[N]={16,15,14,13,12,11,10,9,1,2,3,4,5,6,7,8};
223 int main()
224 {
225 
226     display(a,N);
227 //    ShellSort(a,N);
228 //    BubbleSort(a,N);
229 //    BubbleUpDownSort(a,N);
230 //    QuickSort(a,0,N-1);
231 //     SelectSort(a,N);  
232     HeapSort(a,N);
233     display(a,N);
234 
235     system("pause");
236     return 0;
237 }
posted @ 2012-10-08 00:18  qinpan  阅读(198)  评论(0编辑  收藏  举报