• 排序算法java版


    转 http://www.blogjava.net/luluyanglu/archive/2011/10/07/360090.html

    本文思路部分来源于上篇文章,但测得的结果似乎不大相同,不知是因为java的缘故还是因为我算法的缘故,欢迎拍砖。

    复习排序,顺便比下各种算法的速度,榜单如下:

    1、冒泡排序

    2、简单选择排序

    3、直接插入排序

    4、折半插入排序

    5、希尔排序

    6、堆排序

    7、归并排序

    8、快速排序

    不稳定:快速排序,希尔排序,堆排序。


    当然这是慢速排行,哈哈~~

    直接上图:单位毫秒

    数量

    冒泡排序

    简单选择排序

    直接插入排序

    折半插入排序

    希尔排序

    堆排序

    归并排序

    快速排序

    10000

    1578

    1250

    672

    250

    0

    15

    16

    0

    15000

    3453

    2765

    1563

    531

    16

    15

    16

    0

    20000

    6140

    4547

    2453

    828

    16

    16

    15

    16

    25000

    10079

    7171

    3969

    1313

    31

    16

    15

    16

    30000

    14641

    10313

    5578

    1906

    31

    31

    16

    31

    35000

    20141

    14328

    7890

    2563

    31

    31

    32

    15

    40000

    25766

    18359

    10094

    3422

    47

    31

    31

    32

    45000

    32469

    24063

    13062

    4359

    47

    47

    31

    47

    由于"希尔排序","堆排序","归并排序","快速排序"太快,以至于在上图几乎是条直线,故有了下面转为他们准备的加强版

    数量

    希尔排序

    堆排序

    归并排序

    快速排序

    100000

    172

    140

    110

    93

    200000

    469

    406

    235

    234

    300000

    812

    703

    422

    375

    400000

    1125

    1031

    516

    531

    500000

    1406

    1282

    719

    656

    600000

    1828

    1703

    860

    859

    700000

    2531

    2063

    1000

    968

    800000

    2735

    2453

    1140

    1188

    900000

    3047

    2843

    1391

    1266

    1000000

    3375

    3187

    1516

    1422

    1100000

    3922

    3500

    1625

    1609

    1200000

    4421

    3954

    1969

    1812

    1300000

    4797

    4422

    2000

    1953

    1400000

    5391

    4797

    2547

    2094

    1500000

    5437

    5219

    2625

    2328

    1600000

    6203

    5546

    2469

    2485

    1700000

    6532

    5953

    2844

    2672

    1800000

    7125

    6421

    2984

    2844

    补上代码:

    Java代码 收藏代码
    1. import java.util.ArrayList;
    2. import java.util.Arrays;
    3. import java.util.List;

    4. public class SortTest {

    5. public static void main(String[] args)throws Exception {
    6. //测试排序是否正确
    7. //String[] testErr=new String[]{"冒泡排序","简单选择排序","直接插入排序","折半插入排序","系尔排序","堆排序","归并排序","快速排序"};
    8. //new SortTest().testErr(testErr);

    9. //排序1(全部)
    10. String[] strs=new String[]{"冒泡排序","简单选择排序","直接插入排序","折半插入排序","希尔排序","堆排序","归并排序","快速排序"};
    11. new SortTest().test(strs,10000,50000,5000);

    12. //排序2(加强)
    13. String[] strs2=new String[]{"希尔排序","堆排序","归并排序","快速排序"};
    14. new SortTest().test(strs2,100000,1900000,100000);

    15. }
    16. private void testErr(String[] strings) throws Exception{

    17. //System.out.println(Arrays.toString(old));
    18. System.out.println(Arrays.toString(strings));

    19. Number[] old=getRundom(50);
    20. Integer[] oo={1,2,3,3,2,21,5,6,7,78,5,65,8,7,6,6,6,6,6,9,56544,354,32,4,456,8,89,-9,0,3,243,-321,321,-3,-2,21};
    21. old=oo;
    22. for(String s:strings){
    23. Number[] testNum=Arrays.copyOf(old, old.length);
    24. long begin=System.currentTimeMillis();
    25. SortTest.class.getMethod(s, Number[].class).invoke(this, (Object)testNum);

    26. long end=System.currentTimeMillis();
    27. System.out.println(s+":"+(end-begin)+" ");
    28. System.out.println(Arrays.toString(testNum));
    29. }
    30. System.out.println();


    31. }

    32. private void test(String[] strings,long begin,long end,long step) throws Exception{
    33. System.out.print("数量 ");
    34. for(String str:strings){
    35. System.out.print(str+" ");
    36. }
    37. System.out.println();
    38. for(long i=begin;i
    39. System.out.print(i+"个 ");
    40. Number[] old=getRundom(i);
    41. for(String s:strings){
    42. Number[] testNum=Arrays.copyOf(old, old.length);
    43. long beginTime=System.currentTimeMillis();
    44. SortTest.class.getMethod(s, Number[].class).invoke(this, (Object)testNum);

    45. long endTime=System.currentTimeMillis();
    46. System.out.print((endTime-beginTime)+" ");
    47. //System.out.println(Arrays.toString(testNum));
    48. }
    49. System.out.println();
    50. }

    51. }

    52. private static Integer[] getRundom(long num) {
    53. List list=new ArrayList();
    54. for(long i=0;i
    55. int k;
    56. if(Math.random()>0.5){
    57. k=(int)(Math.random()*Integer.MAX_VALUE);
    58. }else{
    59. k=(int)(Math.random()*Integer.MIN_VALUE);
    60. }
    61. list.add(k);
    62. }
    63. return list.toArray(new Integer[list.size()]);
    64. }




    65. public static void 直接插入排序(Number[] data)
    66. {
    67. Number tmp=null ;

    68. for(int i=1;i
    69. tmp = data[i];
    70. int j=i-1;
    71. while(j>=0 && tmp.doubleValue()
    72. data[j+1]=data[j];
    73. j--;
    74. }
    75. data[j+1]=tmp;
    76. }
    77. }
    78. public static void 折半插入排序(Number[] data)
    79. {
    80. Number tmp=null ;
    81. for(int i=1;i
    82. tmp = data[i];
    83. int smallpoint=0;
    84. int bigpoint=i-1;

    85. while(bigpoint>=smallpoint){
    86. int mid=(smallpoint+bigpoint)/2;
    87. if(tmp.doubleValue()>data[mid].doubleValue()){
    88. smallpoint=mid+1;
    89. }else{
    90. bigpoint=mid-1;
    91. }
    92. }
    93. for(int j=i;j>smallpoint;j--){
    94. data[j]=data[j-1];
    95. }
    96. data[bigpoint+1]=tmp;
    97. }
    98. }

    99. public static void 希尔排序(Number[] data)
    100. {
    101. int span=data.length/7;
    102. if(span==0)span=1;
    103. while(span>=1){
    104. for(int i=0;i
    105. for(int j=i;j
    106. //组内直接插入排序
    107. int p = j-span;
    108. Number temp = data[j];
    109. while( p >=0 && data[p].doubleValue() > temp.doubleValue()){
    110. data[p+span] = data[p];
    111. p -=span;
    112. }
    113. data[p + span] = temp;
    114. }
    115. }
    116. span=span/2;
    117. }


    118. }

    119. public static void 冒泡排序(Number[] data)
    120. {
    121. for (int i = 0; i < data.length; i++) {
    122. //将相邻两个数进行比较,较大的数往后冒泡
    123. for (int j = 0; j < data.length - i-1; j++) {
    124. if (data[j].doubleValue()> data[j + 1].doubleValue()) {
    125. //交换相邻两个数
    126. swap(data, j, j + 1);
    127. }
    128. }
    129. }
    130. }
    131. public static void 快速排序(Number[] data)
    132. {
    133. QuickSort(data,0,data.length-1);
    134. }

    135. private static void QuickSort(Number[] data, int begin, int end) {
    136. // System.out.println(begin+":"+end);
    137. if(begin
    138. //取中点
    139. int mid=(begin+end)/2;
    140. if(data[end].doubleValue()
    141. swap(data, end, begin);
    142. }
    143. if(data[end].doubleValue()
    144. swap(data, end, mid);
    145. }
    146. if(data[mid].doubleValue()
    147. swap(data, mid, begin);
    148. }

    149. swap(data, mid, begin);

    150. // System.out.println(Arrays.toString(Arrays.copyOfRange(data, begin, end)) );
    151. int min=begin+1;
    152. int big=end;

    153. while(true){
    154. while(min
    155. while(min=data[begin].doubleValue()){big--;}
    156. if(min>=big){
    157. break;
    158. }
    159. swap(data, min, big);
    160. }
    161. if(data[begin].doubleValue()>data[min].doubleValue()){
    162. swap(data, begin, min);
    163. }

    164. if(min>1)
    165. QuickSort(data,begin,min-1);
    166. //if(min
    167. QuickSort(data,min,end);
    168. }
    169. }
    170. public static void 简单选择排序(Number[] data)
    171. {
    172. for (int i = 0; i < data.length-1; i++) {
    173. int smallPoint=i;
    174. for (int j = i+1; j < data.length; j++) {
    175. if (data[smallPoint].doubleValue()> data[j].doubleValue()) {
    176. smallPoint=j;
    177. }
    178. }
    179. swap(data, i, smallPoint);
    180. }

    181. }

    182. public static void 堆排序(Number[] data)
    183. {

    184. int n = data.length;
    185. for(int i=n/2;i>=0;i--){
    186. keepHeap(data, n, i);
    187. }
    188. while (n > 0) {
    189. swap(data, 0, n-1);
    190. keepHeap(data, --n, 0);
    191. }
    192. }


    193. private static void keepHeap(Number[] a, int n, int i) {
    194. Number x = a[i];
    195. int j = 2 * i + 1;
    196. while (j <= n - 1) {
    197. if (j < n - 1 && a[j].doubleValue() < a[j + 1].doubleValue())
    198. ++j;
    199. if (a[j].doubleValue() > x.doubleValue()) {
    200. a[i] = a[j];
    201. i = j;
    202. j = 2 * i ;
    203. } else{
    204. break;
    205. }
    206. }
    207. a[i] = x;
    208. }




    209. public static void 归并排序(Number[] data)
    210. {
    211. Number[] result = merge_sort(data,0,data.length-1);
    212. for(int i=0;i
    213. data[i]=result[i];
    214. }
    215. }
    216. private static Number[] merge_sort(Number[] array, int start, int end){
    217. Number[] result = new Number[end-start+1];
    218. if(start< end){
    219. int mid= (start+end)/2;
    220. Number[] left= merge_sort(array, start, mid);
    221. Number[] right = merge_sort(array, mid+1, end);
    222. result= merge(left,right);
    223. } else if (start == end) {
    224. result[0] = array[start];
    225. return result;
    226. }
    227. return result;
    228. }
    229. private static Number[] merge(Number[] left, Number[] right) {
    230. Number[] result = new Number[left.length+right.length];
    231. int i=0;
    232. int j=0;
    233. int k=0;
    234. while(i< left.length&&j< right.length){
    235. if(left[i].doubleValue()< right[j].doubleValue()){
    236. result[k++] = left[i++];
    237. }else{
    238. result[k++] = right[j++];

    239. }
    240. }
    241. while(i< left.length){
    242. result[k++] = left[i++];
    243. }
    244. while (j< right.length) {
    245. result[k++]= right[j++];
    246. }
    247. return result;
    248. }

    249. private static void swap(Number[] data, int x, int y) {
    250. Number temp = data[x];
    251. data[x] = data[y];
    252. data[y] = temp;
    253. }
    254. }
  • 相关阅读:
    Centos7部署jenkins
    查看杀死django进程
    【填坑】python3 manage.py migrate:?: (mysql.W002) MySQL Strict Mode is not set for database connection 'default'
    Amazon S3 加密
    向 Elastic Beanstalk 环境中添加数据库
    Amazon RDS 监控概览
    AWS Lambda 环境变量
    使用 DynamoDB Auto Scaling 自动管理吞吐容量
    使用 Amazon Aurora Auto Scaling 扩展 Aurora 副本
    ECS 服务 Auto Scaling 和 Application Auto Scaling
  • 原文地址:https://www.cnblogs.com/luckForever/p/7254428.html
Copyright © 2020-2023  润新知