近几天再重新看数据结构的书时,根据各种排序的空间复杂度,发现快速排序所用时间是最短的,也即是说快速排序的速度最快。因此想验证一下具体这几个排序发的快慢,所以在Java中得以实现,同时在运行时,发现虽然快速排序的速度很快,但是它所消耗的内存是最大的。这也说明了当我们追求速度时,也必须要付出其他方面的代价。以下是几种方法的具体实现,及其所消耗的时间。
首先在Java中随机生成20个1000以内的数,然后使用四种排序法分别进行排序,验证四种排序程序的无误,以下是具体结果:
通过以上结果证明四种排序方法均可以达到排序目的,以下是对四种排序法时间的测试,观看各个测试时间的长短,具体结果如下所示:
以上是对随机生成的10万个数进行排序时所需时间,从上显然可看出冒泡所需时间为27秒,选择排序为8秒,而插入排序为5秒,冒泡排序时间为0秒。所以冒泡是最慢的而选择居其次,快速排序是最快的。以下是具体代码:
1 /**
2 * 作者:曹家铭
3 * 日期:2016,4,7
4 * 功能:演示冒泡,选择,插入,快速排序的时间快慢程度比较
5 */
6 package com.Paixu;
7
8 import java.util.Calendar;
9
10 public class Paixu {
11
12 public static void main(String[] args) {
13 // TODO Auto-generated method stub
14
15 int N=100000;
16 int arr[]=new int[N];
17 for(int i=0;i<N;i++)
18 {
19 int m=(int)(Math.random()*1000);
20 arr[i]=m;
21 }
22 Bubble bubble=new Bubble();
23 Select select=new Select();
24 Insert insert=new Insert();
25 Quick quick=new Quick();
26 Calendar calendar=Calendar.getInstance();//打印当前系统时间
27 //冒泡排序所用时间
28 System.out.println("冒泡排序前的时间为:"+calendar.getTime());
29 bubble.sort(arr);
30 calendar=Calendar.getInstance();
31 System.out.println("冒泡排序后的时间为:"+calendar.getTime());//打印排序后的时间*/
32 //选择排序所用时间
33 System.out.println("选择排序前的时间为:"+calendar.getTime());
34 select.sort(arr);
35 calendar=Calendar.getInstance();
36 System.out.println("选择排序后的时间为:"+calendar.getTime());//打印排序后的时间*/
37 //插入排序所用时间
38 System.out.println("插入排序前的时间为:"+calendar.getTime());
39 insert.sort(arr);
40 calendar=Calendar.getInstance();
41 System.out.println("插入排序后的时间为:"+calendar.getTime());//打印排序后的时间*/
42 //快速排序所用时间
43 System.out.println("快速排序前的时间为:"+calendar.getTime());
44 quick.sort(0, arr.length-1, arr);
45 calendar=Calendar.getInstance();
46 System.out.println("快速排序后的时间为:"+calendar.getTime());//打印排序后的时间
47 //冒泡排序后的结果
48 bubble.sort(arr);
49 System.out.println("冒泡排序之后的数组顺序为:");
50 for(int i=0;i<arr.length;i++)
51 {
52 System.out.print(arr[i]+" ");
53 }
54 System.out.println();
55 //选择排序后的结果
56 select.sort(arr);
57 System.out.println("选择排序之后的数组顺序为:");
58 for(int i=0;i<arr.length;i++)
59 {
60 System.out.print(arr[i]+" ");
61 }
62 System.out.println();
63 //插入排序的结果
64 insert.sort(arr);
65 System.out.println("插入排序之后的数组顺序为:");
66 for(int i=0;i<arr.length;i++)
67 {
68 System.out.print(arr[i]+" ");
69 }
70 System.out.println();
71 //快速排序的结果
72 quick.sort(0, arr.length-1, arr);
73 System.out.println("快速排序之后的数组顺序为:");
74 for(int i=0;i<arr.length;i++)
75 {
76 System.out.print(arr[i]+" ");
77 }
78 }
79
80 }
81 //快速排序
82 class Quick{
83 public void sort(int fist,int last,int arry[]){
84 int f=fist;
85 int l=last;
86 int mid=arry[(fist+last)/2];
87 int temp=0;
88 while(f<l){
89 while(arry[f]<mid) f++;
90 while(arry[l]>mid) l--;
91 if(f>=l) break;
92 temp=arry[f];
93 arry[f]=arry[l];
94 arry[l]=temp;
95 if(arry[f]==mid) --l;
96 if(arry[l]==mid) ++f;
97 }
98 if(f==l){
99 f++;
100 l--;
101 }
102 //利用递归快速排序
103 if(fist<l) sort(fist,l,arry);
104 if(last>f) sort(f,last,arry);
105 }
106 }
107 //插入排序
108 class Insert{
109 public void sort(int arry[]){
110 for(int i=1;i<arry.length;i++)
111 {
112 int InsertNum=arry[i];
113 int Index=i-1;
114 while(Index>=0&&InsertNum<arry[Index])
115 {
116 arry[Index+1]=arry[Index];//将前一个数复制给后一个比他小的数
117 Index--;
118 }
119 arry[Index+1]=InsertNum;//将该插入的数复制给前一个较小的数
120 }
121 }
122 }
123 //冒泡排序
124 class Bubble{
125 public void sort(int arry[]){
126 int temp=0;
127 for(int i=0;i<arry.length-1;i++)
128 {
129 for(int j=0;j<arry.length-i-1;j++)
130 {
131 if(arry[j]>arry[j+1])
132 {
133 temp=arry[j];
134 arry[j]=arry[j+1];
135 arry[j+1]=temp;
136 }
137 }
138 }
139 }
140 }
141 //选择排序
142 class Select{
143 public void sort(int arry[]){
144 int temp=0;
145 for(int i=0;i<arry.length-1;i++)
146 {
147 int min=arry[i];
148 int minIndex=i;
149 for(int j=i+1;j<arry.length-1;j++)
150 {
151 if(min>arry[j])
152 {
153 min=arry[j];
154 minIndex=j;
155 }
156 }
157 temp=arry[i];
158 arry[i]=arry[minIndex];
159 arry[minIndex]=temp;
160 }
161 }
162 }