[Java]代码
view sourceprint?
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 }