001 | /** |
002 |
*
|
003 |
*/
|
004 |
package sortAlgorithm;
|
005 |
006 |
import java.io.File;
|
007 |
import java.io.IOException;
|
008 |
import java.sql.Time;
|
009 |
import java.util.Random;
|
010 |
011 | /** |
012 |
* @author sky
|
013 |
* 该类给出各种排序算法
|
014 |
*
|
015 |
*/
|
016 |
017 |
public class sort{
|
018 |
private static Integer[] elem(int n){
|
019 |
int N=n;
|
020 |
Random random=new Random();
|
021 |
Integer elem[]=new Integer[N];
|
022 |
for (int i=0;i<N;i++){
|
023 |
elem[i]=random.nextInt(1000);
|
024 |
}
|
025 |
return elem;
|
026 |
}
|
027 |
public static void main (String Args[]) throws InterruptedException{
|
028 |
int n=30000;
|
029 |
Integer elem[]=elem(n);
|
030 |
long start,end;
|
031 |
|
032 |
class sort0 extends Thread{
|
033 |
Integer elem[];
|
034 |
int n;
|
035 |
sort0(Integer elem[],int n){
|
036 |
this.elem=elem;
|
037 |
this.n=n;
|
038 |
}
|
039 |
public void run(){
|
040 |
System.out.println("线程启动");
|
041 |
straightInsertSort(elem,n);
|
042 |
}
|
043 |
}
|
044 |
|
045 |
elem=elem(n);
|
046 |
start=System.currentTimeMillis();
|
047 |
sort0 s1=new sort0(elem,n);
|
048 |
|
049 |
elem=elem(n);
|
050 |
sort0 s2=new sort0(elem,n);
|
051 |
elem=elem(n);
|
052 |
sort0 s3=new sort0(elem,n);
|
053 |
elem=elem(n);
|
054 |
sort0 s4=new sort0(elem,n);
|
055 |
elem=elem(n);
|
056 |
sort0 s5=new sort0(elem,n);
|
057 |
s1.start();
|
058 |
s2.start();
|
059 |
s3.start();
|
060 |
s4.start();
|
061 |
s5.start();
|
062 |
s2.join();
|
063 |
s1.join();
|
064 |
s3.join();
|
065 |
s4.join();
|
066 |
s5.join();
|
067 |
System.out.println("多线程简单插入排序:");
|
068 |
end=System.currentTimeMillis();
|
069 |
|
070 |
System.out.println(end-start);
|
071 |
|
072 |
elem=elem(n);
|
073 |
start=System.currentTimeMillis();
|
074 |
straightInsertSort(elem,n);
|
075 |
end=System.currentTimeMillis();
|
076 |
System.out.println("简单插入排序:");
|
077 |
System.out.println(end-start);
|
078 |
|
079 |
elem=elem(n);
|
080 |
start=System.currentTimeMillis();
|
081 |
shellSort(elem,n);
|
082 |
end=System.currentTimeMillis();
|
083 |
System.out.println("希尔排序:");
|
084 |
System.out.println(end-start);
|
085 |
|
086 |
elem=elem(n);
|
087 |
start=System.currentTimeMillis();
|
088 |
bubbleSort(elem,n);
|
089 |
end=System.currentTimeMillis();
|
090 |
System.out.println("冒泡排序:");
|
091 |
System.out.println(end-start);
|
092 |
|
093 |
/*
|
094 |
elem=elem(n);
|
095 |
start=System.currentTimeMillis();
|
096 |
quickSort(elem,n);
|
097 |
end=System.currentTimeMillis();
|
098 |
System.out.println("快速排序:");
|
099 |
System.out.println(end-start);*/
|
100 |
|
101 |
elem=elem(n);
|
102 |
start=System.currentTimeMillis();
|
103 |
simpleSelectionSort(elem,n);
|
104 |
end=System.currentTimeMillis();
|
105 |
System.out.println("简单选择排序:");
|
106 |
System.out.println(end-start);
|
107 |
|
108 |
elem=elem(n);
|
109 |
start=System.currentTimeMillis();
|
110 |
heapSort(elem,n);
|
111 |
end=System.currentTimeMillis();
|
112 |
System.out.println("堆排序:");
|
113 |
System.out.println(end-start);
|
114 |
|
115 |
elem=elem(n);
|
116 |
start=System.currentTimeMillis();
|
117 |
mergeSort(elem,n);
|
118 |
end=System.currentTimeMillis();
|
119 |
System.out.println("归并排序:");
|
120 |
System.out.println(end-start);
|
121 |
}
|
122 |
|
123 |
//显示排序结果
|
124 |
public static <T extends Comparable<? super T>> void show(T[] elem,int n){
|
125 |
for (int i=0;i<n;i++){
|
126 |
System.out.print(elem[i]);
|
127 |
System.out.print(' ');
|
128 |
}
|
129 |
System.out.println();
|
130 |
}
|
131 |
//交换元素
|
132 |
private static <T extends Comparable<? super T>> void swap(T[] elem,int i,int j){
|
133 |
T tmp=elem[i];
|
134 |
elem[i]=elem[j];
|
135 |
elem[j]=tmp;
|
136 |
}
|
137 |
//直接插入排序法,复杂度为O(n^2)
|
138 |
public static <T extends Comparable<? super T>> void straightInsertSort (T elem[],intn){
|
139 |
for (int i=1;i<n;i++){
|
140 |
T e=elem[i];
|
141 |
int j;
|
142 |
for (j=i-1;j>=0 && e.compareTo(elem[j])<0;j--){
|
143 |
elem[j+1]=elem[j];
|
144 |
}
|
145 |
elem[j+1]=e;
|
146 |
}
|
147 |
}
|
148 |
//shell插入排序算法,复杂度为O(n^1.5)
|
149 |
private static <T extends Comparable<? super T>> void shellInsertHelp(T elem[],intn,int incr){
|
150 |
for (int i=incr;i<n;i++){
|
151 |
T e=elem[i];
|
152 |
int j=i-incr;
|
153 |
for (;j>=0 && e.compareTo(elem[j])<0;j=j-incr){
|
154 |
elem[j+incr]=elem[j];
|
155 |
}
|
156 |
elem[j+incr]=e;
|
157 |
|
158 |
}
|
159 |
}
|
160 |
public static <T extends Comparable<? super T>> void shellSort(T elem[],int n ){
|
161 |
for (int incr=n/2;incr>0;incr=incr/2){
|
162 |
shellInsertHelp(elem,n,incr);
|
163 |
}
|
164 |
}
|
165 |
//冒泡排序算法,时间复杂度为O(n^2)
|
166 |
public static <T extends Comparable<? super T>> void bubbleSort(T elem[],int n){
|
167 |
for (int i=n-1;i>0;i--){
|
168 |
for (int j=0;j<i;j++){
|
169 |
if (elem[j].compareTo(elem[i])>0){
|
170 |
swap(elem,i,j);
|
171 |
}
|
172 |
}
|
173 |
}
|
174 |
}
|
175 |
//快速排序算法,时间复杂度为O(n*log(n))
|
176 |
private static <T extends Comparable<? super T>> int partition(T elem[],int low,inthigh){
|
177 |
while (low<high){
|
178 |
for (;elem[high].compareTo(elem[low])>=0 && low<high;high--);
|
179 |
swap(elem,high,low);
|
180 |
for (;elem[high].compareTo(elem[low])>=0 && low<high;low++);
|
181 |
swap(elem,high,low);
|
182 |
}
|
183 |
return low;
|
184 |
}
|
185 |
private static <T extends Comparable<? super T>> void quickSortHelp(T elem[],intlow,int high){
|
186 |
if (low<high){
|
187 |
int pivot=partition(elem,low,high);
|
188 |
quickSortHelp(elem,low,pivot-1);
|
189 |
quickSortHelp(elem,pivot+1,high);
|
190 |
}
|
191 |
}
|
192 |
public static <T extends Comparable<? super T>> void quickSort(T elem[],int n){
|
193 |
quickSortHelp(elem,0,n-1);
|
194 |
}
|
195 |
//简单选择排序算法,时间复杂度为O(n^2)
|
196 |
public static <T extends Comparable<? super T>> void simpleSelectionSort(T elem[],intn){
|
197 |
for (int i=0;i<n-1;i++){
|
198 |
int lowIdx=i;
|
199 |
for (int j=i+1;j<n;j++){
|
200 |
if (elem[lowIdx].compareTo(elem[j])>0)
|
201 |
lowIdx=j;
|
202 |
}
|
203 |
swap(elem,lowIdx,i);
|
204 |
}
|
205 |
}
|
206 |
//堆排序,时间复杂度为O(n*log(n))
|
207 |
private static <T extends Comparable<? super T>> void heapAdjust(T elem[],int low,inthigh){
|
208 |
for (int i=low,lhs=2*i+1 ;lhs<=high;lhs=2*i+1){
|
209 |
if (lhs<high && elem[lhs].compareTo(elem[lhs+1])<0)lhs++;
|
210 |
if (elem[i].compareTo(elem[lhs])<0){
|
211 |
swap(elem,i,lhs);
|
212 |
i=lhs;
|
213 |
}else break;
|
214 |
}
|
215 |
}
|
216 |
public static <T extends Comparable<? super T>> void heapSort(T elem[],int n){
|
217 |
//初始化堆
|
218 |
for (int i=(n-2)/2;i>=0;i--){
|
219 |
heapAdjust(elem,i,n-1);
|
220 |
}
|
221 |
swap(elem,0,n-1);
|
222 |
//排序
|
223 |
for (int i=n-2;i>0;--i){
|
224 |
heapAdjust(elem,0,i);
|
225 |
swap(elem,0,i);
|
226 |
}
|
227 |
}
|
228 |
//归并排序算法,时间复杂度为O(n*log(n))
|
229 |
private static <T extends Comparable<? super T>> void simpleMerge(T elem[],T tmpElem[],int low ,int mid, int high){
|
230 |
int i=low,j=mid+1,k=low;
|
231 |
for (;i<=mid && j<=high;k++){
|
232 |
if (elem[i].compareTo(elem[j])<=0)
|
233 |
tmpElem[k]=elem[i++];
|
234 |
else
|
235 |
tmpElem[k]=elem[j++];
|
236 |
}
|
237 |
for (;i<=mid;i++){
|
238 |
tmpElem[k++]=elem[i];
|
239 |
}
|
240 |
for (;j<=high;j++){
|
241 |
tmpElem[k++]=elem[j];
|
242 |
}
|
243 |
|
244 |
for (;low<=high;low++){
|
245 |
elem[low]=tmpElem[low];
|
246 |
}
|
247 |
}
|
248 |
private static <T extends Comparable<? super T>> void mergeHelp(T elem[],T tmpElem[],int low ,int high){
|
249 |
if (low < high){
|
250 |
int mid=(low+high)/2;
|
251 |
mergeHelp(elem,tmpElem,low,mid);
|
252 |
mergeHelp(elem,tmpElem,mid+1,high);
|
253 |
simpleMerge(elem,tmpElem,low,mid,high);
|
254 |
}
|
255 |
}
|
256 |
public static <T extends Comparable<? super T>> void mergeSort(T elem[],int n){
|
257 |
T[] tmpElem=(T[])new Comparable[n];
|
258 |
mergeHelp(elem,tmpElem,0,n-1);
|
259 |
}
|
260 | } |
本文通过实现多种排序算法,包括直接插入排序、希尔排序、冒泡排序、快速排序等,并使用多线程进行简单插入排序,对比了不同算法的时间效率。
3111

被折叠的 条评论
为什么被折叠?



