1、排序算法1. importjava.util.Random; 2. /* 3. *排序测试类 4. *排序算法的分类如下:1.插入排序(直接插入排序、折半插入排序、希尔排序);2.交换排序(冒泡泡排序、快速排序); 5. *3.选择排序(直接选择排序、堆排序);4.归并排序;5.基数排序。 6. *关于排序方法的选择:(1)若n较小(如n50),可采用直接插入或直接选择排序。 7. *当记录规模较小时,直接插入排序较好;否则因为直接选择移动的记录数少于直接插人,应选直接选择排序为宜。 8. *(2)若文件初始状态基本有序(指正序),则应选用直接插人、冒泡或随机的快速排序为宜; 9. *(3)若
2、n较大,则应采用时间复杂度为O(nlgn)的排序方法:快速排序、堆排序或归并排序。 10. */ 11. /* 12. *descriptionJAVA排序汇总 13. */ 14. publicclassSortTest 15. /=产生随机数=/ 16. publicintcreateArray() 17. Randomrandom=newRandom(); 18. intarray=newint10; 19. for(inti=0;i10;i+) 20. arrayi=random.nextInt(100)-random.nextInt(100);/生成两个随机数相减,保证生成的数中有负
3、数 21. 22. System.out.println(=原始序列=); 23. printArray(array); 24. returnarray; 25. 26. publicvoidprintArray(intdata) 27. for(inti:data) 28. System.out.print(i+); 29. 30. System.out.println(); 31. 32. 33. /* 34. *description交换相邻两个数 35. *dateNov19,2009 36. *authorHDS 37. *paramdata 38. *paramx 39. *par
4、amy 40. */ 41. publicvoidswap(intdata,intx,inty) 42. inttemp=datax; 43. datax=datay; 44. datay=temp; 45. 46. 47. /* 48. *冒泡排序-交换排序的一种 49. *方法:相邻两元素进行比较,如有需要则进行交换,每完成一次循环就将最大元素排在最后(如从小到大排序),下一次循环是将其他的数进行类似操作。 50. *性能:比较次数O(n2),n2/2;交换次数O(n2),n2/4 51. * 52. *paramdata 53. *要排序的数组 54. *paramsortType 55
5、. *排序类型 56. *return 57. */ 58. publicvoidbubbleSort(intdata,StringsortType) 59. if(sortType.equals(asc)/正排序,从小排到大 60. /比较的轮数 61. for(inti=1;idata.length;i+)/数组有多长,轮数就有多长 62. /将相邻两个数进行比较,较大的数往后冒泡 63. for(intj=0;jdataj+1) 65. /交换相邻两个数 66. swap(data,j,j+1); 67. 68. 69. 70. elseif(sortType.equals(desc)/
6、倒排序,从大排到小 71. /比较的轮数 72. for(inti=1;idata.length;i+) 73. /将相邻两个数进行比较,较大的数往后冒泡 74. for(intj=0;jdata.length-i;j+) 75. if(datajdataj+1) 76. /交换相邻两个数 77. swap(data,j,j+1); 78. 79. 80. 81. else 82. System.out.println(您输入的排序类型错误!); 83. 84. printArray(data);/输出冒泡排序后的数组值 85. 86. 87. /* 88. *直接选择排序法-选择排序的一种方
7、法:每一趟从待排序的数据元素中选出最小(或最大)的一个元素, 89. *顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。性能:比较次数O(n2),n2/2交换次数O(n),n 90. *交换次数比冒泡排序少多了,由于交换所需CPU时间比比较所需的CUP时间多,所以选择排序比冒泡排序快。 91. *但是N比较大时,比较所需的CPU时间占主要地位,所以这时的性能和冒泡排序差不太多,但毫无疑问肯定要快些。 92. */ 93. publicvoidselectSort(intdata,StringsortType) 94. if(sortType.endsWith(asc)/正排序,从小
8、排到大 95. intindex; 96. for(inti=1;idata.length;i+) 97. index=0; 98. for(intj=1;jdataindex) 100. index=j; 101. 102. 103. /交换在位置data.length-i和index(最大值)两个数 104. swap(data,data.length-i,index); 105. 106. elseif(sortType.equals(desc)/倒排序,从大排到小 107. intindex; 108. for(inti=1;idata.length;i+) 109. index=0;
9、 110. for(intj=1;j=data.length-i;j+) 111. if(datajdataindex) 112. index=j; 113. 114. 115. /交换在位置data.length-i和index(最大值)两个数 116. swap(data,data.length-i,index); 117. 118. else 119. System.out.println(您输入的排序类型错误!); 120. 121. printArray(data);/输出直接选择排序后的数组值 122. 123. /* 124. *插入排序方法:将一个记录插入到已排好序的有序表(有
10、可能是空表)中,从而得到一个新的记录数增1的有序表。性能:比较次数O(n2),n2/4 125. *复制次数O(n),n2/4比较次数是前两者的一般,而复制所需的CPU时间较交换少,所以性能上比冒泡排序提高一倍多,而比选择排序也要快。 126. * 127. *paramdata 128. *要排序的数组 129. *paramsortType 130. *排序类型 131. */ 132. publicvoidinsertSort(intdata,StringsortType) 133. if(sortType.equals(asc)/正排序,从小排到大 134. /比较的轮数 135. f
11、or(inti=1;idata.length;i+) 136. /保证前i+1个数排好序 137. for(intj=0;jdatai) 139. /交换在位置j和i两个数 140. swap(data,i,j); 141. 142. 143. 144. elseif(sortType.equals(desc)/倒排序,从大排到小 145. /比较的轮数 146. for(inti=1;idata.length;i+) 147. /保证前i+1个数排好序 148. for(intj=0;ji;j+) 149. if(datajdatai) 150. /交换在位置j和i两个数 151. swap
12、(data,i,j); 152. 153. 154. 155. else 156. System.out.println(您输入的排序类型错误!); 157. 158. printArray(data);/输出插入排序后的数组值 159. 160. /* 161. *反转数组的方法 162. */ 163. publicvoidreverse(intdata) 164. intlength=data.length; 165. inttemp=0;/临时变量 166. for(inti=0;ilength/2;i+) 167. temp=datai; 168. datai=datalength-
13、1-i; 169. datalength-1-i=temp; 170. 171. printArray(data);/输出到转后数组的值 172. 173. 174. /* 175. *快速排序快速排序使用分治法(Divideandconquer)策略来把一个序列(list)分为两个子序列(sub-lists)。步骤为: 176. *1.从数列中挑出一个元素,称为基准(pivot),2. 177. *重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分割之后,该基准是它的最后位置。这个称为分割(partition)操作。 178
14、. *3.递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。 179. *递回的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递回下去,但是这个算法总会结束,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。 180. *paramdata 181. *待排序的数组 182. *seeSortTest#qsort(int,int,int) 183. *seeSortTest#qsort_desc(int,int,int) 184. */ 185. publicvoidquickSort(intdata,Str
15、ingsortType) 186. if(sortType.equals(asc)/正排序,从小排到大 187. qsort_asc(data,0,data.length-1); 188. elseif(sortType.equals(desc)/倒排序,从大排到小 189. qsort_desc(data,0,data.length-1); 190. else 191. System.out.println(您输入的排序类型错误!); 192. 193. 194. 195. /* 196. *快速排序的具体实现,排正序 197. */ 198. privatevoidqsort_asc(in
16、tdata,intlow,inthigh) 199. inti,j,x; 200. if(lowhigh)/这个条件用来结束递归 201. i=low; 202. j=high; 203. x=datai; 204. while(ij) 205. while(ix) 206. j-;/从右向左找第一个小于x的数 207. 208. if(ij) 209. datai=dataj; 210. i+; 211. 212. while(ij&dataix) 213. i+;/从左向右找第一个大于x的数 214. 215. if(ij) 216. dataj=datai; 217. j-; 218.
17、219. 220. datai=x; 221. qsort_asc(data,low,i-1); 222. qsort_asc(data,i+1,high); 223. 224. 225. 226. /* 227. *快速排序的具体实现,排倒序 228. */ 229. privatevoidqsort_desc(intdata,intlow,inthigh) 230. inti,j,x; 231. if(lowhigh)/这个条件用来结束递归 232. i=low; 233. j=high; 234. x=datai; 235. while(ij) 236. while(ij&datajx) 237. j-;/从右向左找第一个小于x的数 238. 239. if(ij) 240. datai=dataj; 241. i+; 242. 243. while(ix) 244.
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1