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[], int n){
|
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[], int n, 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, int high){
|
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[], int low, 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[], int n){
|
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, int high){
|
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 | } |