java实现各种排序算法

[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 }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值