Java中各种排序算法

[1].[代码] [Java]代码跳至[1]

view source

print?

001 //插入排序:

002

003 package org.rut.util.algorithm.support;

004

005 import org.rut.util.algorithm.SortUtil;

006 /**

007 * @author treeroot

008 * @since 2006-2-2

009 * @version 1.0

010 */

011 public class InsertSort implements SortUtil.Sort{

012

013 /** (non-Javadoc)

014 * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[]) 015 */

016 public void sort(int[] data) {

017 int temp;

018 for(int i=1;i

019 for(int j=i;(j>0)&&(data[j]

020 SortUtil.swap(data,j,j-1);

021 }

022 }

023 }

024

025 }

026 //冒泡排序:

027

028

029 for(var i=0; i

030 for(var j=i+1; j<=arr.length-1; j++) {

031 if(eval(arr[i]) < eval(arr[j])) {

032 temp = arr[i];

033 arr[i] = arr[j];

034 arr[j] =

temp;

035 }

036 }

037 }

038

039

040 041 package org.rut.util.algorithm.support;

042

043 import org.rut.util.algorithm.SortUtil;

044

045 /**

046 * @author treeroot

047 * @since 2006-2-2

048 * @version 1.0

049 */

050 public class BubbleSort implements SortUtil.Sort{

051

052 /** (non-Javadoc)

053 * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[]) 054 */

055 public void sort(int[] data) {

056 int temp;

057 for(int i=0;i

058 for(int j=data.length-1;j>i;j--){

059 if(data[j]

060 SortUtil.swap(data,j,j-1);

061 }

062 }

063 }

064 }

065

067

068 //选择排序:

069

070 package org.rut.util.algorithm.support;

071

072 import org.rut.util.algorithm.SortUtil;

073

074 /**

075 * @author treeroot

076 * @since 2006-2-2

077 * @version 1.0

078 */

079 public class SelectionSort implements SortUtil.Sort {

080

081 /**

082 * (non-Javadoc)

083 *

084 * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[]) 085 */

086 public void sort(int[] data) {

087 int temp;

088 for(int i =0; i < data.length; i++) {

089 int lowIndex = i;

090 for(int j = data.length -1; j > i; j--) {

091 if(data[j] < data[lowIndex]) {

092 lowIndex = j;

093 }

094 }

095 SortUtil.swap(data,i,lowIndex);

096 }

097 }

098

099 }

101 //Shell排序:

102

103 package org.rut.util.algorithm.support;

104

105 import org.rut.util.algorithm.SortUtil;

106

107 /**

108 * @author treeroot

109 * @since 2006-2-2

110 * @version 1.0

111 */

112 public class ShellSort implements SortUtil.Sort{

113

114 /** (non-Javadoc)

115 * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[]) 116 */

117 public void sort(int[] data) {

118 for(int i=data.length/2;i>2;i/=2){

119 for(int j=0;j

120 insertSort(data,j,i);

121 }

122 }

123 insertSort(data,0,1);

124 }

125

126 /**

127 * @param data

128 * @param j

129 * @param i

130 */

131 private void insertSort(int[] data,int start,int inc) { 132 int temp;

133 for(int i=start+inc;i

134 for(int j=i;(j>=inc)&&(data[j]

136 }

137 }

138 }

139

140 }

141

142 //快速排序:

143

144 package org.rut.util.algorithm.support;

145

146 import org.rut.util.algorithm.SortUtil;

147

148 /**

149 * @author treeroot

150 * @since 2006-2-2

151 * @version 1.0

152 */

153 public class QuickSort implements SortUtil.Sort{

154

155 /** (non-Javadoc)

156 * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[]) 157 */

158 public void sort(int[] data) {

159 quickSort(data,0,data.length-1);

160 }

161 private void quickSort(int[] data,int i,int j){

162 int pivotIndex=(i+j)/2;

163 //swap

164 SortUtil.swap(data,pivotIndex,j);

165

166 int k=partition(data,i-1,j,data[j]);

167 SortUtil.swap(data,k,j);

168 if((k-i)>1) quickSort(data,i,k-1);

169 if((j-k)>1) quickSort(data,k+1,j);

170

171 }

172 /**

173 * @param data

174 * @param i

175 * @param j

176 * @return

177 */

178 private int partition(int[] data,int l,int r,int pivot) { 179 do{

180 while(data[++l]

181 while((r!=0)&&data[--r]>pivot);

182 SortUtil.swap(data,l,r);

183 }

184 while(l

185 SortUtil.swap(data,l,r);

186 return l;

187 }

188

189 }

190 //改进后的快速排序:

191

192 package org.rut.util.algorithm.support;

193

194 import org.rut.util.algorithm.SortUtil;

195

196 /**

197 * @author treeroot

198 * @since 2006-2-2

199 * @version 1.0

200 */

201 public class ImprovedQuickSort implements SortUtil.Sort {

202

203 private static int MAX_STACK_SIZE=4096;

204 private static int THRESHOLD=10;

205 /** (non-Javadoc)

206 * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[]) 207 */

208 public void sort(int[] data) {

209 int[] stack=new int[MAX_STACK_SIZE];

210

211 int top=-1;

212 int pivot;

213 int pivotIndex,l,r;

214

215 stack[++top]=0;

216 stack[++top]=data.length-1;

217

218 while(top>0){

219 int j=stack[top--];

220 int i=stack[top--];

221

222 pivotIndex=(i+j)/2;

223 pivot=data[pivotIndex];

224

225 SortUtil.swap(data,pivotIndex,j);

226

227 //partition

228 l=i-1;

229 r=j;

230 do{

231 while(data[++l]

232 while((r!=0)&&(data[--r]>pivot));

233 SortUtil.swap(data,l,r);

234 }

235 while(l

236 SortUtil.swap(data,l,r);

237 SortUtil.swap(data,l,j);

238

239 if((l-i)>THRESHOLD){

240 stack[++top]=i;

241 stack[++top]=l-1;

242 }

243 if((j-l)>THRESHOLD){

244 stack[++top]=l+1;

245 stack[++top]=j;

246 }

247

248 }

249 //new InsertSort().sort(data);

250 insertSort(data);

251 }

252 /**

253 * @param data

254 */

255 private void insertSort(int[] data) {

256 int temp;

257 for(int i=1;i

258 for(int j=i;(j>0)&&(data[j]

260 }

261 }

262 }

263

264 }

265

266 //归并排序:

267

268 package org.rut.util.algorithm.support;

269

270 import org.rut.util.algorithm.SortUtil;

271

272 /**

273 * @author treeroot

274 * @since 2006-2-2

275 * @version 1.0

276 */

277 public class MergeSort implements SortUtil.Sort{

278

279 /** (non-Javadoc)

280 * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[]) 281 */

282 public void sort(int[] data) {

283 int[] temp=new int[data.length];

284 mergeSort(data,temp,0,data.length-1);

285 }

286

287 private void mergeSort(int[] data,int[] temp,int l,int r){ 288 int mid=(l+r)/2;

289 if(l==r)return;

290 mergeSort(data,temp,l,mid);

291 mergeSort(data,temp,mid+1,r);

292 for(int i=l;i<=r;i++){

293 temp[i]=data[i];

294 }

295 int i1=l;

296 int i2=mid+1;

297 for(int cur=l;cur<=r;cur++){

298 if(i1==mid+1)

299 data[cur]=temp[i2++];

300 else if(i2>r)

301 data[cur]=temp[i1++];

302 else if(temp[i1]

303 data[cur]=temp[i1++];

304 else

305 data[cur]=temp[i2++];

306 }

307 }

308

309 }

310

311 //改进后的归并排序:

312

313 package org.rut.util.algorithm.support;

314

315 import org.rut.util.algorithm.SortUtil;

316

317 /**

318 * @author treeroot

319 * @since 2006-2-2

320 * @version 1.0

321 */

322 public class ImprovedMergeSort implements SortUtil.Sort {

323

324 private static final int THRESHOLD =10;

325

326 /**

327 * (non-Javadoc)

328 *

329 * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[]) 330 */

331 public void sort(int[] data) {

332 int[] temp=new int[data.length];

333 mergeSort(data,temp,0,data.length-1);

334 }

335

336 private void mergeSort(int[] data,int[] temp,int l,int r) { 337 int i, j, k;

338 int mid = (l + r) /2;

339 if(l == r)

340 return;

341 if((mid - l) >= THRESHOLD)

342 mergeSort(data, temp, l, mid);

343 else

344 insertSort(data, l, mid - l +1); 345 if((r - mid) > THRESHOLD)

346 mergeSort(data, temp, mid +1, r); 347 else

348 insertSort(data, mid +1, r - mid); 349

350 for(i = l; i <= mid; i++) {

351 temp[i] = data[i];

352 }

353 for(j =1; j <= r - mid; j++) {

354 temp[r - j +1] = data[j + mid];

355 }

356 int a = temp[l];

357 int b = temp[r];

358 for(i = l, j = r, k = l; k <= r; k++) { 359 if(a < b) {

360 data[k] = temp[i++];

361 a = temp[i];

362 }else{

363 data[k] = temp[j--];

364 b = temp[j];

365 }

366 }

367 }

368

369 /**

370 * @param data

371 * @param l

372 * @param i

373 */

374 private void insertSort(int[] data,int start,int len) { 375 for(int i=start+1;i

376 for(int j=i;(j>start) && data[j]

378 }

379 }

380 }

381

382 }

383 //堆排序:

384

385 package org.rut.util.algorithm.support;

386

387 import org.rut.util.algorithm.SortUtil;

388

389 /**

390 * @author treeroot

391 * @since 2006-2-2

392 * @version 1.0

393 */

394 public class HeapSort implements SortUtil.Sort{

395

396 /** (non-Javadoc)

397 * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[]) 398 */

399 public void sort(int[] data) {

400 MaxHeap h=new MaxHeap();

401 h.init(data);

402 for(int i=0;i

403 h.remove();

404 System.arraycopy(h.queue,1,data,0,data.length);

405 }

406

407

408 private static class MaxHeap{

409

410

411 void init(int[] data){

412 this.queue=new int[data.length+1];

413 for(int i=0;i

414 queue[++size]=data[i];

415 fixUp(size);

416 }

417 }

418

419 private int size=0;

420

421 private in t[] queue;

422

423 public int get() {

424 return queue[1];

425 }

426

427 public void remove() {

428 SortUtil.swap(queue,1,size--);

429 fixDown(1);

430 }

431 //fixdown

432 private void fixDown(int k) {

433 int j;

434 while((j = k <<1) <= size) {

435 if(j < size && queue[j]

437 if(queue[k]>queue[j])//不用交换

438 brea k;

439 SortUtil.swap(queue,j,k);

440 k = j;

441 }

442 }

443 private void fixUp(int k) {

444 while(k >1) {

445 int j = k >>1;

446 if(queue[j]>queue[k])

447 brea k;

448 SortUtil.swap(queue,j,k);

449 k = j;

450 }

451 }

452

453 }

454

455 }

456

457

458

459 //SortUtil:

460

461 package org.rut.util.algorithm;

462

463 import org.rut.util.algorithm.support.BubbleSort;

464 import org.rut.util.algorithm.support.HeapSort;

465 import org.rut.util.algorithm.support.ImprovedMergeSort; 466 import org.rut.util.algorithm.support.ImprovedQuickSort; 467 import org.rut.util.algorithm.support.InsertSort;

468 import org.rut.util.algorithm.support.MergeSort;

469 import org.rut.util.algorithm.support.QuickSort;

470 import org.rut.util.algorithm.support.SelectionSort;

471 import org.rut.util.algorithm.support.ShellSort;

472

473 /**

474 * @author treeroot

475 * @since 2006-2-2

476 * @version 1.0

477 */

478 public class SortUtil {

479 public final static int INSERT =1;

480

481 public final static int BUBBLE =2;

482

483 public final static int SELECTION =3;

484

485 public final static int SHELL =4;

486

487 public final static int QUICK =5;

488

489 public final static int IMPROVED_QUICK =6; 490

491 public final static int MERGE =7;

492

493 public final static int IMPROVED_MERGE =8; 494

495 public final static int HEAP =9;

496

497 public static void sort(in t[] data) {

498 sort(data, IMPROVED_QUICK);

499 }

500 private static String[] name={

50 1

"insert","bubble","selection","shell","quick","improved_qui ck","merge","improved_merge","heap"

502 };

503

504 private static Sort[] impl=new Sort[]{ 505 new InsertSort(),

506 new BubbleSort(),

507 new SelectionSort(),

508 new ShellSort(),

509 new QuickSort(),

510 new ImprovedQuickSort(),

511 new MergeSort(),

512 new ImprovedMergeSort(),

513 new HeapSort()

514 };

515

516 public static String toString(int algorithm){

517 return name[algorithm-1];

518 }

519

520 public static void sort(in t[] data,int algorithm) { 521 impl[algorithm-1].sort(data);

522 }

523

524 public static interface Sort {

525 public void sort(in t[] data);

526 }

527

528 public static void swap(in t[] data,int i,int j) { 529 int temp = data[i];

530 data[i] = data[j];

531 data[j] = temp;

532 }

533 }

各种排序算法的总结和比较

各种排序算法的总结和比较 1 快速排序(QuickSort) 快速排序是一个就地排序,分而治之,大规模递归的算法。从本质上来说,它是归并排序的就地版本。快速排序可以由下面四步组成。 (1)如果不多于1个数据,直接返回。 (2)一般选择序列最左边的值作为支点数据。(3)将序列分成2部分,一部分都大于支点数据,另外一部分都小于支点数据。 (4)对两边利用递归排序数列。 快速排序比大部分排序算法都要快。尽管我们可以在某些特殊的情况下写出比快速排序快的算法,但是就通常情况而言,没有比它更快的了。快速排序是递归的,对于内存非常有限的机器来说,它不是一个好的选择。 2 归并排序(MergeSort)

归并排序先分解要排序的序列,从1分成2,2分成4,依次分解,当分解到只有1个一组的时候,就可以排序这些分组,然后依次合并回原来的序列中,这样就可以排序所有数据。合并排序比堆排序稍微快一点,但是需要比堆排序多一倍的内存空间,因为它需要一个额外的数组。 3 堆排序(HeapSort) 堆排序适合于数据量非常大的场合(百万数据)。 堆排序不需要大量的递归或者多维的暂存数组。这对于数据量非常巨大的序列是合适的。比如超过数百万条记录,因为快速排序,归并排序都使用递归来设计算法,在数据量非常大的时候,可能会发生堆栈溢出错误。 堆排序会将所有的数据建成一个堆,最大的数据在堆顶,然后将堆顶数据和序列的最后一个数据交换。接下来再次重建堆,交换数据,依次下去,就可以排序所有的数据。

Shell排序通过将数据分成不同的组,先对每一组进行排序,然后再对所有的元素进行一次插入排序,以减少数据交换和移动的次数。平均效率是O(nlogn)。其中分组的合理性会对算法产生重要的影响。现在多用D.E.Knuth的分组方法。 Shell排序比冒泡排序快5倍,比插入排序大致快2倍。Shell排序比起QuickSort,MergeSort,HeapSort慢很多。但是它相对比较简单,它适合于数据量在5000以下并且速度并不是特别重要的场合。它对于数据量较小的数列重复排序是非常好的。 5 插入排序(InsertSort) 插入排序通过把序列中的值插入一个已经排序好的序列中,直到该序列的结束。插入排序是对冒泡排序的改进。它比冒泡排序快2倍。一般不用在数据大于1000的场合下使用插入排序,或者重复排序超过200数据项的序列。

数据结构 各种排序算法

数据结构各种排序算法总结 2009-08-19 11:09 计算机排序与人进行排序的不同:计算机程序不能象人一样通览所有的数据,只能根据计算机的"比较"原理,在同一时间内对两个队员进行比较,这是算法的一种"短视"。 1. 冒泡排序 BubbleSort 最简单的一个 public void bubbleSort() { int out, in; for(out=nElems-1; out>0; out--) // outer loop (backward) for(in=0; in a[in+1] ) // out of order? swap(in, in+1); // swap them } // end bubbleSort() 效率:O(N2) 2. 选择排序 selectSort public void selectionSort() { int out, in, min; for(out=0; out

swap(out, min); // swap them } // end for(out) } // end selectionSort() 效率:O(N2) 3. 插入排序 insertSort 在插入排序中,一组数据在某个时刻实局部有序的,为在冒泡和选择排序中实完全有序的。 public void insertionSort() { int in, out; for(out=1; out0 && a[in-1] >= temp) // until one is smaller, { a[in] = a[in-1]; // shift item to right --in; // go left one position } a[in] = temp; // insert marked item } // end for } // end insertionSort() 效率:比冒泡排序快一倍,比选择排序略快,但也是O(N2) 如果数据基本有序,几乎需要O(N)的时间

java程序员必知的十种程序算法

java程序员必学的十种程序算法 算法1:快速排序算法 快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。 快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists)。 算法步骤: 1 从数列中挑出一个元素,称为“基准”(pivot),

2 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。 3 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。 递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算法总会退出,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。 算法2:堆排序算法

堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。 堆排序的平均时间复杂度为Ο(nlogn) 。 算法步骤: 创建一个堆H[0..n-1] 把堆首(最大值)和堆尾互换 3. 把堆的尺寸缩小1,并调用shift_down(0),目的是把新的数组顶端数据调整到相应位置 4. 重复步骤2,直到堆的尺寸为1 算法3:归并排序 归并排序(Merge sort,台湾译作:合并排序)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。 算法步骤:

数据结构-各类排序算法总结

数据结构-各类排序算法总结 原文转自: https://www.360docs.net/doc/025882846.html,/zjf280441589/article/details/38387103各类排序算法总结 一. 排序的基本概念 排序(Sorting)是计算机程序设计中的一种重要操作,其功能是对一个数据元素集合或序列重新排列成一个按数据元素 某个项值有序的序列。 有n 个记录的序列{R1,R2,…,Rn},其相应关键字的序列是{K1,K2,…,Kn},相应的下标序列为1,2,…,n。通过排序,要求找出当前下标序列1,2,…,n 的一种排列p1,p2,…,pn,使得相应关键字满足如下的非递减(或非递增)关系,即:Kp1≤Kp2≤…≤Kpn,这样就得到一个按关键字有序的记录序列{Rp1,Rp2,…,Rpn}。 作为排序依据的数据项称为“排序码”,也即数据元素的关键码。若关键码是主关键码,则对于任意待排序序列,经排序后得到的结果是唯一的;若关键码是次关键码,排序结果可

能不唯一。实现排序的基本操作有两个: (1)“比较”序列中两个关键字的大小; (2)“移动”记录。 若对任意的数据元素序列,使用某个排序方法,对它按关键码进行排序:若相同关键码元素间的位置关系,排序前与排序后保持一致,称此排序方法是稳定的;而不能保持一致的排序方法则称为不稳定的。 二.插入类排序 1.直接插入排序直接插入排序是最简单的插入类排序。仅有一个记录的表总是有序的,因此,对n 个记录的表,可从第二个记录开始直到第n 个记录,逐个向有序表中进行插入操作,从而得到n个记录按关键码有序的表。它是利用顺序查找实现“在R[1..i-1]中查找R[i]的插入位置”的插入排序。

JAVA数组的排序方法实例

冒泡排序法 1.public class SortArray_01 { 2. public static void main(String args[]) { 3. int[] array = { 14, 5, 86, 4, 12, 3, 21, 13, 11, 2, 55 }; // 创建一个初始化的一维数组array 4. System.out.println("未排序的数组:"); 5. for (int i = 0; i < array.length; i++) { // 遍历array数组中的元素 6. System.out.print(" " + array[i]); // 输出数组元素 7. if ((i + 1) % 5 == 0) // 每5个元素一行 8. System.out.println(); 9. } 10. int mid; // 定义一个中间变量, 起到临时存储数据的作用 11. for (int i = 0; i < array.length; i++) { // 执行冒 泡排序法 12. for (int j = i; j < array.length; j++) { 13. if (array[j] < array[i]) { 14. mid = array[i]; 15. array[i] = array[j]; 16. array[j] = mid; 17. } 18. } 19. } 20. System.out.println("\n使用冒泡法排序后的数组:"); 21. for (int i = 0; i < array.length; i++) { // 遍历排好序的array数组中的元素 22. System.out.print(" " + array[i]); // 输出数组元素 23. if ((i + 1) % 5 == 0) 24. System.out.println(); // 每5 个元素一行 25. } 26. } 27.} 数组递增排序

JAVA中运用数组的四种排序方法

JAVA中在运用数组进行排序功能时,一般有四种方法:快速排序法、冒泡法、选择排序法、插入排序法。 快速排序法主要是运用了Arrays中的一个方法Arrays.sort()实现。 冒泡法是运用遍历数组进行比较,通过不断的比较将最小值或者最大值一个一个的遍历出来。 选择排序法是将数组的第一个数据作为最大或者最小的值,然后通过比较循环,输出有序的数组。 插入排序是选择一个数组中的数据,通过不断的插入比较最后进行排序。下面我就将他们的实现方法一一详解供大家参考。 <1>利用Arrays带有的排序方法快速排序 import java.util.Arrays; publicclass Test2{ publicstaticvoid main(String[] args){ int[] a={5,4,2,4,9,1}; Arrays.sort(a); //进行排序 for(int i: a){ System.out.print(i); } } } <2>冒泡排序算法 publicstaticint[] bubbleSort(int[] args){//冒泡排序算法 for(int i=0;iargs[j]){ int temp=args[i]; args[i]=args[j]; args[j]=temp; } } } return args; } <3>选择排序算法 publicstaticint[] selectSort(int[] args){//选择排序算法 for (int i=0;i

各大常用排序方法

//1. 希尔排序, 时间复杂度:O(nlogn)~ O(n^2) // 另称:缩小增量排序(Diminishing Increment Sort) void ShellSort(int v[],int n) { int gap, i, j, temp; for(gap=n/2; gap>0; gap /= 2) /* 设置排序的步长,步长gap每次减半,直到减到1 */ { for(i=gap; i=0) && (v[j]>v[j+gap]); j -= gap ) /* 比较相距gap远的两个元素的大小,根据排序方向决定如何调换 */ { temp = v[j]; v[j] = v[j+gap]; v[j+gap] = temp; } } } } //2. 二分插入, void HalfInsertSort(int a[], int len) { int i, j, temp; int low, high, mid; for (i=1; i temp) /* 如果中间元素比但前元素大,当前元素要插入到中间元素的左侧 */ { high = mid-1;

} else /* 如果中间元素比当前元素小,但前元素要插入到中间元素的右侧 */ { low = mid+1; } } /* 找到当前元素的位置,在low和high之间 */ for (j=i-1; j>high; j--)/* 元素后移 */ { a[j+1] = a[j]; } a[high+1] = temp; /* 插入 */ } } //3. 插入排序 //3.1 直接插入排序, 时间复杂度:O(n^2) void StraightInsertionSort(int input[],int len) { int i, j, temp; for (i=1; i=0 && input[j]>temp; j--) /* 从当前元素的上一个元素开始查找合适的位置 */ { input[j+1] = input[j]; /* 一边找一边移动元素 */ input[j] = temp; } } } //3.2 带哨兵的直接排序, 时间复杂度:O(n^2) /* * 带哨兵的直接插入排序,数组的第一个元素不用于存储有效数据 * 将input[0]作为哨兵,可以避免判定input[j]中,数组是否越界 * 因为在j--的过程中,当j减小到0时,变成了input[0]与input[0] * 自身进行比较,很明显这个时候说明位置i之前的数字都比input[i]小

java中8大排序方法

Java程序员必知的8大排序本文主要详解了Java语言的8大排序的基本思想以及实例解读,详细请看下文8种排序之间的关系: 1,直接插入排序 (1)基本思想:在要排序的一组数中,假设前面(n-1)[n>=2] 个数已经是排 好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数 也是排好顺序的。如此反复循环,直到全部排好顺序。 (2)实例

(3)用java实现 1.package com.njue; 2. 3.public class insertSort { 4.public insertSort(){ 5. inta[]={49,38,65,97,76,13,27,49,78,34,12,64,5,4,62,99,98,54,56,17, 18,23,34,15,35,25,53,51}; 6.int temp=0; 7.for(int i=1;i=0&&temp

C C++笔试面试题目汇总3——各种排序算法

C/C++笔试面试题目汇总3——各种排序算法 原文:https://www.360docs.net/doc/025882846.html,/u/1222/showart_318070.html 排序算法是一种基本并且常用的算法。由于实际工作中处理的数量巨大,所以排序算法对算法本身的速度要求很高。而一般我们所谓的算法的性能主要是指算法的复杂度,一般用O方法来表示。在后面我将给出详细的说明。对于排序的算法我想先做一点简单的介绍,也是给这篇文章理一个提纲。 我将按照算法的复杂度,从简单到难来分析算法。 第一部分是简单排序算法,后面你将看到他们的共同点是算法复杂度为O(N*N)(因为没有使用word,所以无法打出上标和下标)。 第二部分是高级排序算法,复杂度为O(Log2(N))。这里我们只介绍一种算法。另外还有几种算法因为涉及树与堆的概念,所以这里不于讨论。 第三部分类似动脑筋。这里的两种算法并不是最好的(甚至有最慢的),但是算法本身比较奇特,值得参考(编程的角度)。同时也可以让我们从另外的角度来认识这个问题。 第四部分是我送给大家的一个餐后的甜点——一个基于模板的通用快速排序。由于是模板函数可以对任何数据类型排序(抱歉,里面使用了一些论坛专家的呢称)。 一、简单排序算法 由于程序比较简单,所以没有加什么注释。所有的程序都给出了完整的运行代码,并在我的VC环境下运行通过。因为没有涉及MFC和WINDOWS的内容,所以在BORLAND C++的平台上应该也不会有什么问题的。在代码的后面给出了运行过程示意,希望对理解有帮助。 1.冒泡法:(Gilbert:点这里有视频) 这是最原始,也是众所周知的最慢的算法了。他的名字的由来因为它的工作看来象是冒泡: #include void BubbleSort(int* pData,int Count) { int iTemp; for(int i=1;i=i;j--) { if(pData[j]

小学语文排序题方法技巧汇总排序

专题——句子 句子之排序 1、考点 定义:排序类题就是把一组顺序错乱的句子按照正确的顺序重新排列,解这类题的关键是要找出这组句子的行文顺序,再把它们重新排列。 2、例题分析 例题1:将下列句子排列正确。 ()科学家对此进行研究。 ()正常人的眼睛能感知这个世界的五彩缤纷,识别红、橙、黄、绿、青、蓝、紫,以及它们之间的各种过渡色,总共约六十多种。 ()如牛、羊、马等,几乎不会分辨颜色,反映到它们眼里的只有黑、白、灰三种颜色,很单调。 ()那么,动物的感色能力又如何呢? ()研究证实,大多数哺乳动物是色盲。 试题分析: 此题着重考察学生的语言组织能力。对于众多的句子如何确定第一句是解此题的关键。接着找出几个句子之间的联系点,这也是至关重要的一个因素。 解题思路: 首先,要通读所有的句子,整体感知这段文字,初步明确这段文字主要写的是什么,围绕什么来写的。在这段文字中,首先写的是人的眼睛对色彩的感知,而后过渡到动物。中间一句设问句是很好的承接,接下来是科学家投入了研究,最后是研究的结果,并以此举例说明。所有的句子试填好后,要将句子按正确的排列顺序通读一遍,最后检查序号是否正确。 参考答案:3 1 5 2 4。 例题2 : 将①-④句填在横线上,顺序恰当的一项是()。 沿池环水四周,新筑一道长600多米的环池路,还有那修复完美的明代遗迹“临流亭”,

四周环水,兀立池中,游客观望,流连忘返。 ①形态各异的飞禽雕塑,浮游水面 ②水上画舫往返,笑声朗朗 ③路面铺设的鹅卵石,在碧波辉映下,色彩鲜艳,晶莹闪烁 ④路边垂柳依依,清风送爽 ③④②① B、④②③① C、③④①② D、④③①② 解题指导: 这是一道在所给的语段中选择恰当的选项填空题。考查的是思维的连贯与严密。解答此类题目,要瞻前顾后,从空缺处的前文或后文找出句与句之间内在的联系,通过上下文要通畅连贯或句式要前后一致等方面来确定正确的选项。 此题空缺处前文是写“环池路”,与之文气连贯的当然是选项中③句,接着介绍“路面”,接着就为第④句介绍“路边”,然后由“沿池环水四周”的“路边”,自然引出第②句,介绍“水上”,最后第①句交待水上的“飞禽雕塑”,则“雕塑”又与后句的“临流亭”同属建筑,自然衔接。所以正确答案为“A”。参考答案:A 例题3 : ()这时,我们才发现社区里的工作人员虽然很多,但是在一些死角里还会看见灰尘。 ()到了社区,同学们都冻得发抖,但又不敢松懈。 ( )虽然很冷,但我们每个人额头上都有豆大的汗珠。 ()有的同学在擦窗户,有的同学在扫水泥地面,有的同学在捡石头,有的同学在除草,还有同学在推小车送垃圾,我也和一些同学捡石块。 ()由于风太大的缘故,扫起来了许多的尘土,把大家呛得直打喷气,但大家都不觉得苦,继续埋头苦干。 ()我们各自分工之后,都开始行动起来了。 ( ) 同学们把自己的活干完之后又去帮忙干别的事了。 解题思路: 乱句排文的练习可以帮助学生训练思维,此题是按事件发展顺序排列,先是事件的起因,再是事件的过程,最后是结果。 题目答案:2 1 7 4 5 3 6

工作总结范文精选:各种排序方法复杂度总结

各种排序方法复杂度总结 一、冒泡排序 主要思路是: 通过交换相邻的两个数变成小数在前大数在后,这样每次遍历后,最大的数就“沉”到最后面了。重复N次即可以使数组有序。 代码实现 voidbubble_sort(intarr[],intlen) for(inti=0;i=i;j――) if(arr[j]

冒泡排序改进2: 记录某次遍历时最后发生数据交换的位置,这个位置之后的数据显然已经有序。因此设置标志位记录每次遍历中最后发生数据交换的位置可以确定下次循环的范围。 二、直接插入排序 主要思路是: 每次将一个待排序的数组元素,插入到前面已排序的序列中这个元素应该在的位置,直到全部数据插入完成。类似扑克牌洗牌过程。 代码实现 void_sort(intarr[],intlen) for(inti=1;i―1&&k

三、直接选择排序 主要思路是: 数组分成有序区和无序区,初始时整个数组都是无序区,每次遍历都从无序区选择一个最小的元素直接放在有序区最后,直到排序完成。 代码实现 voidselect_sort(intarr[],intlen) for(inti=0;i

数据结构各种排序算法总结

数据结构各种排序算法总结 计算机排序与人进行排序的不同:计算机程序不能象人一样通览所有的数据,只能根据计算机的"比较"原理,在同一时间内对两个队员进行比较,这是算法的一种"短视"。 1. 冒泡排序BubbleSort 最简单的一个 public void bubbleSort() { int out, in; for(out=nElems-1; out>0; out--) // outer loop (backward) for(in=0; in a[in+1] ) // out of order? swap(in, in+1); // swap them } // end bubbleSort() 效率:O(N2) 2. 选择排序selectSort public void selectionSort() { int out, in, min; for(out=0; out

3. 插入排序insertSort 在插入排序中,一组数据在某个时刻实局部有序的,为在冒泡和选择排序中实完全有序的。public void insertionSort() { int in, out; for(out=1; out0 && a[in-1] >= temp) // until one is smaller, { a[in] = a[in-1]; // shift item to right --in; // go left one position } a[in] = temp; // insert marked item } // end for } // end insertionSort() 效率:比冒泡排序快一倍,比选择排序略快,但也是O(N2) 如果数据基本有序,几乎需要O(N)的时间 4. 归并排序mergeSort 利用递归,不断的分割数组,然后归并有序数组 效率为O(N*logN),缺点是需要在存储器中有一个大小等于被排序的数据项数目的数组。public void mergeSort() // called by main() { // provides workspace long[] workSpace = new long[nElems]; recMergeSort(workSpace, 0, nElems-1); } //-----------------------------------------------------------

Java各种排序算法

Java排序算法 1)分类: 1)插入排序(直接插入排序、希尔排序) 2)交换排序(冒泡排序、快速排序) 3)选择排序(直接选择排序、堆排序) 4)归并排序 5)分配排序(箱排序、基数排序) 所需辅助空间最多:归并排序 所需辅助空间最少:堆排序 平均速度最快:快速排序 不稳定:快速排序,希尔排序,堆排序。 1)选择排序算法的时候 1.数据的规模; 2.数据的类型; 3.数据已有的顺序 一般来说,当数据规模较小时,应选择直接插入排序或冒泡排序。任何排序算法在数据量小时基本体现不出来差距。考虑数据的类型,比如如果全部是正整数,那么考虑使用桶排序为最优。考虑数据已有顺序,快排是一种不稳定的排序(当然可以改进),对于大部分排好的数据,快排会浪费大量不必要的步骤。数据量极小,而起已经基本排好序,冒泡是最佳选择。我们说快排好,是指大量随机数据下,快排效果最理想。而不是所有情况。 3)总结: ——按平均的时间性能来分: 1)时间复杂度为O(nlogn)的方法有:快速排序、堆排序和归并排序,其中以快速排序为最好; 2)时间复杂度为O(n2)的有:直接插入排序、起泡排序和简单选择排序,其中以直接插入为最好,特别是对那些对关键字近似有序的记录序列尤为如此; 3)时间复杂度为O(n)的排序方法只有,基数排序。 当待排记录序列按关键字顺序有序时,直接插入排序和起泡排序能达到O(n)的时间复杂度;而对于快速排序而言,这是最不好的情况,此时的时间性能蜕化为O(n2),因此是应该尽量避免的情况。简单选择排序、堆排序和归并排序的时间性能不随记录序列中关键字的分布而改变。 ——按平均的空间性能来分(指的是排序过程中所需的辅助空间大小): 1)所有的简单排序方法(包括:直接插入、起泡和简单选择)和堆排序的空间复杂度为O(1); 2)快速排序为O(log n ),为栈所需的辅助空间; 3)归并排序所需辅助空间最多,其空间复杂度为O(n ); 4)链式基数排序需附设队列首尾指针,则空间复杂度为O(rd )。 ——排序方法的稳定性能: 1)稳定的排序方法指的是,对于两个关键字相等的记录,它们在序列中的相对位置,在排序之前和经过排序之后,没有改变。 2)当对多关键字的记录序列进行LSD方法排序时,必须采用稳定的排序方法。 3)对于不稳定的排序方法,只要能举出一个实例说明即可。 4)快速排序,希尔排序和堆排序是不稳定的排序方法。 4)插入排序: 包括直接插入排序,希尔插入排序。 直接插入排序:将一个记录插入到已经排序好的有序表中。 1, sorted数组的第0个位置没有放数据。

关于各种排序方法的比较

各种排序方法的总结 一.直接插入排序 1.时间复杂度 移动次数和比较次数受初始排列的影响。 最好情况o(n) 最坏情况o(n2) 平均情况o(n2) 2.空间复杂度:o(1) 3.算法特点 稳定排序; 算法简便,且容易实现 适用于顺序和链式两种存储结构,链式存储时不需要移动记录,只修改指针; 适合于初始记录基本有序的情况; 当记录无序,且n较大时,不宜采用。 二.折半插入排序 1.时间复杂度 移动次数受初始排列的影响。 最好情况o(nlog2n) 最坏情况o(n2) 平均情况o(n2) 2.空间复杂度 o(1) 3.算法特点 稳定排序; 算法简便,且容易实现 只适用于顺序存储结构,不能用于链式存储结构; 适合记录无序、n较大的情况; 三.希尔排序 1.时间复杂度 2.空间复杂度 o(1) 3.算法特点 不稳定排序,记录跳跃式的移动; 只适用于顺序存储结构,不能用于链式存储结构; 增量序列可以有多种取法,最后一个增量值必须是1; 适合记录无序、n较大的情况; 四.冒泡排序 1.时间复杂度 移动次数和比较次数受初始排列的影响。 最好情况o(n) 最坏情况o(n2) 平均情况o(n2) 2.空间复杂度 o(1) 3.算法特点 稳定排序; 适用于顺序存储结构和链式存储结构; 适合记录无序、n较大时不宜采用; 五.快速排序 1.时间复杂度 移动次数和比较次数受初始排列的影响。

最好情况o(nlog2n) 最坏情况o(n2) 平均情况o(nlog2n) 2.空间复杂度:o(log2n) 递归算法 3.算法特点 不稳定排序; 算法简便,且容易实现 适用于顺序存储结构; 适合记录无序,且n较大情况。 六.直接选择排序 1.时间复杂度 比较次数不受初始排列的影响,移动次数受影响。 最好情况o(n2) 最坏情况o(n2) 平均情况o(n2) 2.空间复杂度 o(1) 3.算法特点 不稳定排序; 适用于顺序存储结构和链式存储结构; 移动记录的次数较多,适合记录占用空间较多时,采用此方法; 七.堆排序 1.时间复杂度 移动次数和比较次数受初始排列的影响。 最好情况o(nlog2n) 最坏情况o(nlog2n) 平均情况o(nlog2n) 2.空间复杂度:o(1) 3.算法特点 不稳定排序; 适用于顺序存储结构; n较小时不宜采用。 八.归并排序 1.时间复杂度 移动次数和比较次数受初始排列的影响。 最好情况o(nlog2n) 最坏情况o(nlog2n) 平均情况o(nlog2n) 2.空间复杂度:o(n) 3.算法特点 稳定排序; 适用于顺序和链式两种存储结构; 九.基数排序 1.时间复杂度 唯一一个不通过比较和移动记录实现排序的方法。 最好情况o(d(n+REDIX)) 最坏情况o(d(n+REDIX)) 平均情况o(d(n+REDIX)) 其中,d表示关键字的位数;n表示关键字的个数;REDIX表示基,即位上关键字的取值范围4.空间复杂度:o(n+REDIX) 5.算法特点 稳定排序; 适用于顺序和链式两种存储结构; 使用条件较多,需要知道各级关键字的主次关系和各级关系字的取值范围。

各种排序方法复杂度总结归纳

各种排序方法复杂度总结归纳 一、冒泡排序 主要思路是: 通过交换相邻的两个数变成小数在前大数在后,这样每次遍历后,最大的数就“沉”到最后面了。重复N次即可以使数组有序。 代码实现 void buadfdsle_sort(int arr[],int len) { for (int i = 0; i { for (int j = len —1; j >= i; j——) { if (arr[j] { int temp = arr[j]; arr[j] = arr[j —1]; arr[j —1] = temp; } } } } 冒泡排序改进1: 在某次遍历中,如果没有数据交换,说明整个数组已经有序,因

此通过设置标志位来记录此次遍历有无数据交换就可以判断是否要继续循环。 冒泡排序改进2: 记录某次遍历时最后发生数据交换的位置,这个位置之后的数据显然已经有序。因此设置标志位记录每次遍历中最后发生数据交换的位置可以确定下次循环的范围。 二、直接插入排序 主要思路是: 每次将一个待排序的数组元素,插入到前面已排序的序列中这个元素应该在的位置,直到全部数据插入完成。类似扑克牌洗牌过程。 代码实现 void _sort(int arr[],int len) { for (int i = 1; i { int j = i —1; int k = arr[i]; while (j > —1 && k { arr[j + 1] = arr[j]; j ——; } arr[j + 1] = k; }

} 三、直接选择排序 主要思路是: 数组分成有序区和无序区,初始时整个数组都是无序区,每次遍历都从无序区选择一个最小的元素直接放在有序区最后,直到排序完成。 代码实现 void select_sort(int arr[],int len) { for (int i = 0; i { int index = i; for (int j = i + 1; j { if (arr[j] index = j; } if (index != i) { int temp = arr[i]; arr[i] = arr[index]; arr[index] = temp; } } }

各种排序算法小结

各种排序算法小结 排序算法是一种基本并且常用的算法。由于实际工作中处理的数量巨大,所以排序算法对算法本身的速度要求很高。而一般我们所谓的算法的性能主要是指算法的复杂度,一般用O方法来表示。在后面我将给出详细的说明。 对于排序的算法我想先做一点简单的介绍,也是给这篇文章理一个提纲。我将按照算法的复杂度,从简单到难来分析算法。第一部分是简单排序算法,后面你将看到他们的共同点是算法复杂度为O(N*N)(因为没有使用word,所以无法打出上标和下标)。第二部分是高级排序算法,复杂度为O(Log2(N))。这里我们只介绍一种算法。另外还有几种算法因为涉及树与堆的概念,所以这里不于讨论。第三部分类似动脑筋。这里的两种算法并不是最好的(甚至有最慢的),但是算法本身比较奇特,值得参考(编程的角度)。同时也可以让我们从另外的角度来认识这个问题。第四部分是我送给大家的一个餐后的甜点——一个基于模板的通用快速排序。由于是模板函数可以对任何数据类型排序(抱歉,里面使用了一些论坛专家的呢称)。 现在,让我们开始吧: 一、简单排序算法 由于程序比较简单,所以没有加什么注释。所有的程序都给出了完整的运行代码,并在我的VC环境 下运行通过。因为没有涉及MFC和WINDOWS的内容,所以在BORLAND C++的平台上应该也不会有什么 问题的。在代码的后面给出了运行过程示意,希望对理解有帮助。 1.冒泡法: 这是最原始,也是众所周知的最慢的算法了。他的名字的由来因为它的工作看来象是冒泡: #include void BubbleSort(int*pData,int Count) { int iTemp; for(int i=1;i=i;j--) { if(pData[j]10,9,7,8->10,7,9,8->7,10,9,8(交换3次) 第二轮:7,10,9,8->7,10,8,9->7,8,10,9(交换2次) 第一轮:7,8,10,9->7,8,9,10(交换1次) 循环次数:6次 交换次数:6次 其他: 第一轮:8,10,7,9->8,10,7,9->8,7,10,9->7,8,10,9(交换2次) 第二轮:7,8,10,9->7,8,10,9->7,8,10,9(交换0次) 第一轮:7,8,10,9->7,8,9,10(交换1次) 循环次数:6次 交换次数:3次 上面我们给出了程序段,现在我们分析它:这里,影响我们算法性能的主要部分是循环和交换,显然,次数越多,性能就越差。从上面的程序我们可以看出循环的次数是固定的,为1+2+...+n-1。写成公式就是1/2*(n-1)*n。现在注意,我们给出O方法的定义:

Java数据结构和算法笔记

Java数据结构和算法 第0讲综述 参考教材:Java数据结构和算法(第二版),[美] Robert lafore 1. 数据结构的特性 数据结构< 缺点 优点 数组插入快;如果知道下标,可以非常快地存取查找慢,删除慢,大小固定 有序数组比无序的数组查找快删除和插入慢,大小固定 提供后进先出方式的存取存取其他项很慢 < 栈 队列提供先进先出方式的存取存取其他项很慢 链表插入快,删除快— 查找慢 二叉树查找、插入、删除都快(如果树保持平衡)删除算法复杂 红-黑树查找、插入、删除都快;树总是平衡的算法复杂 算法复杂 2-3-4树` 查找、插入、删除都快;树总是平衡的;类 似的树对磁盘存储有用 哈希表如果关键字已知,则存储极快;插入快删除慢,如果不知道关键字则存 储很慢,对存储空间使用不充分堆插入、删除快;对大数据项的存取很快对其他数据项存取慢 对现实世界建模有些算法慢且复杂 》 图 2. 经典算法总结 查找算法:线性查找和二分查找 排序算法: 用表展示 ! 第一讲数组 1.Java中数组的基础知识 1)创建数组

在Java中把数组当作对象来对待,因此在创建数组时必须使用new操作符: < 一旦创建数组,数组大小便不可改变。 2)访问数组数据项 3)数组的初始化 当创建数组之后,除非将特定的值赋给数组的数据项,否则它们一直是特殊的null对 等效于下面使用new来创建数组并初始化: | 2.面向对象编程方式 1)使用自定义的类封装数组

| # !

子问题须与原始问题为同样的事,且更为简单; b. 不能无限制地调用本身,须有个出口,化简为非递归状况处理。 1.三角数字 该数列中的首项为1,第n项是由第n-1项加n后得到的。 1)使用循环查找第n项

十 大 经 典 排 序 算 法 总 结 超 详 细

前端资源收集 前端资-源收集 收集的资-源 44个 Javascript 变态题解析 javascript 变态题解析 正则表达式收集 正则表达式收集 十大经典排序算法总结(JavaScript描述)排序算法的总结 前端工具库汇总 前端工具库总结 怎么学JavaScript? 学习javascript 的学习指导 不定期更新 JavaScript技巧 javascript 编码技巧总结 H5项目常见问题汇总及解决方案 高质量的常见问题汇总 廖雪峰的 git 教-程 Git忽略规则.gitignore梳理 git 配置提交规则 全局环境,执行环境

setTimeout promises 很酷,但很多人并没有理解就在用了 promises 使用错误汇总 promises webpack 2 中文文档 输入url后的加载过程 详细解答从输入URL 到页面显示的过程 数组Array.prototype方法 介绍了数组的一些新的方法 移动端真机调试 Web 客户端存储 ESLint中文指南 webpack 2 集成ESLint react-webpack2-skeleton webpack 2 react 成功案例,包括热加载 cookie 小结 CSS定制多行省略 Ajax 知识体系大梳理 js+nodejs完成文件上传 用 webpack 实现持久化缓存 搜罗一切webpack的好文章好工具 深入理解 CSS:字体度量、line-height 和 vertical-align

原生JS中DOM节点相关API合集 正则表达式前端使用手册 聊一聊H5应用缓存-Manifest fetch进阶指南 mozilla 开发者网络 深入理解javascript原型和闭包系列JavaScript深入系列 深度长文 JavaScript数组所有API全解密你真的懂 JavaScript 的正则吗?webpack2 终极优化 文件上传那些事儿 写给前端工程师的DNS基础知识 初识weex(前端视角) - 环境搭建 前端命名规范 正则表达式 总有你要的编程书单(GitHub )JavaScript深入系列 javascript 的一些功能点 如何在小程序中调用本地接口 移动端浏览器调试方法汇总 HTML5移动开发中的input输入框类型 互联网协议入门

相关文档
最新文档