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 }