|
497 | 497 | }
|
498 | 498 | }
|
499 | 499 |
|
500 |
| -6. 并归排序MergeSort: |
| 500 | +6. 并归排序MergeSort:(NlgN) |
501 | 501 | 并归实现:ca.mcmaster.chapter.two.Sort.Sort#merge(Comparable[], int, int, int)
|
502 | 502 | 并归排序的实现是基于当前每个子列均是顺序排列。
|
503 | 503 | public static void merge(Comparable[] a, int lo, int mid, int hi){
|
504 |
| - int i = lo, j = mid + 1; //将a[lo-mid] 和a[mid+1-hi]并归 |
505 |
| - Comparable[] aux = new Comparable[a.length]; |
506 |
| - for (int k = lo; k < aux.length; k++) //复制一份原列表的值 |
| 504 | + int i = lo, j = mid + 1; |
| 505 | + if(less(a[mid], a[mid+1])) return; //如果前一半的最后一个元素已经小于后一半的第一个元素,说明需要归并的两半已经是增序的。 |
| 506 | + for (int k = lo; k < aux.length; k++) |
507 | 507 | aux[k] = a[k];
|
508 |
| - for(int k = lo; k < a.length; k++){ |
509 |
| - if(i > mid) a[k] = aux[j++]; //若果两个列中的那哪一个已经出完了,就完全使用另一个列 |
510 |
| - else if(j > hi) a[k] = aux[i++]; |
511 |
| - else if(less(aux[i], aux[j])) a[k] = aux[i++]; //未出完的情况下比较大小,出小的。 |
512 |
| - else a[k] = aux[j++]; |
| 508 | + for(int k = lo; k < a.length; k++){ |
| 509 | + if(i > mid) a[k] = aux[j++]; |
| 510 | + else if(j > hi) a[k] = aux[i++]; |
| 511 | + else if(less(aux[i], aux[j])) a[k] = aux[i++]; |
| 512 | + else a[k] = aux[j++]; |
513 | 513 | }
|
514 | 514 | }
|
515 | 515 |
|
516 |
| - 并归排序实现:ca.mcmaster.chapter.two.Sort.Sort#mergeSort(Comparable[]) |
| 516 | + 自顶向下并归排序实现:ca.mcmaster.chapter.two.Sort.Sort#mergeSort(Comparable[]) |
517 | 517 | 并归排序利用了分治的思想。将大的数组拆成两个数进行归并,在对2-2进行归并,对4-4进行归并直到所有的数均被涵盖。
|
518 | 518 | public static void mergeSort(Comparable[] a){
|
519 | 519 | aux = new Comparable[a.length]; //因为不可避免的要进行数组的复制,所以在最外层进行复制以节约空间。
|
|
527 | 527 | mergeSortIn(a, mid + 1, hi);
|
528 | 528 | merge(a, lo, mid, hi);
|
529 | 529 | }
|
| 530 | + |
| 531 | + 自底向上并归排序实现:ca.mcmaster.chapter.two.Sort.Sort#mergeSortBU(Comparable[]) |
| 532 | + public static void mergeSortBU(Comparable[] a){ |
| 533 | + int length = a.length; |
| 534 | + aux = new Comparable[length]; |
| 535 | + for(int sz = 1; sz < length; sz *= 2){ |
| 536 | + for(int lo = 0; lo < length - sz; lo += sz * 2) |
| 537 | + merge(a, lo, lo+sz-1, Math.min(lo+sz+sz-1, length-1)); //要做一个取小的操作,因为数组的总量不一定是偶数。 |
| 538 | + } |
| 539 | + } |
| 540 | + |
| 541 | +7. 快速排序QuickSort: |
| 542 | + 实现:ca.mcmaster.chapter.two.Sort.Sort#quickSort(Comparable[], int, int) |
| 543 | + 1.随意取出数组中的一个元素(一般都取当前需要sort的第一个元素)。 |
| 544 | + 如果取的是第一个元素: |
| 545 | + 2.我们从第二个元素开始向右进行遍历,再从右向左进行遍历,如果左边的数字大于该数字,右边的数字小于该数字,则两个数字换位置。 |
| 546 | + 3.再针对左边的数字进行排序,再针对右边的数组进行排序。 |
| 547 | + public static void quickSort(Comparable[] a, int lo, int hi){ |
| 548 | + if(lo >= hi) return; |
| 549 | + int j = partition(a, lo, hi); |
| 550 | + quickSort(a, lo, j-1); |
| 551 | + quickSort(a, j+1, hi); |
| 552 | + } |
| 553 | + public static int partition(Comparable[] a, int lo, int hi){ |
| 554 | + int i = lo, j = hi + 1; |
| 555 | + Comparable v = a[lo]; |
| 556 | + while(true){ |
| 557 | + while(less(a[++i], v)) if(i == hi) break; //找到左边第一个小于该元素的数字。 |
| 558 | + while(less(v, a[--j])) if(j == lo) break; //找到右边第一个大于钙元素的数字。 |
| 559 | + if(i >= j) break; //退出外部while循环的条件 |
| 560 | + swap(a, i, j); |
| 561 | + //show(a); |
| 562 | + } |
| 563 | + swap(a, lo, j); //将lo插入左右两个数组之间,使左边的均不大于lo,右边的均不小于hi。 |
| 564 | + return j; |
| 565 | + } |
| 566 | + |
| 567 | + 结果: |
| 568 | + 原数组:18,27,33,55,6,3,23,2,3,5,2,45,1,4,2,5,7,3,7,432,96,7,23,8 |
| 569 | + 每次结果以及最终结果: |
| 570 | + 18 8 33 55 6 3 23 2 3 5 2 45 1 4 2 5 7 3 7 432 96 7 23 27 |
| 571 | + 18 8 7 55 6 3 23 2 3 5 2 45 1 4 2 5 7 3 7 432 96 33 23 27 |
| 572 | + 18 8 7 7 6 3 23 2 3 5 2 45 1 4 2 5 7 3 55 432 96 33 23 27 |
| 573 | + 18 8 7 7 6 3 3 2 3 5 2 45 1 4 2 5 7 23 55 432 96 33 23 27 |
| 574 | + 18 8 7 7 6 3 3 2 3 5 2 7 1 4 2 5 45 23 55 432 96 33 23 27 |
| 575 | + 5 2 7 7 6 3 3 2 3 5 2 7 1 4 8 18 45 23 55 432 96 33 23 27 |
| 576 | + 5 2 4 7 6 3 3 2 3 5 2 7 1 7 8 18 45 23 55 432 96 33 23 27 |
| 577 | + 5 2 4 1 6 3 3 2 3 5 2 7 7 7 8 18 45 23 55 432 96 33 23 27 |
| 578 | + 5 2 4 1 2 3 3 2 3 5 6 7 7 7 8 18 45 23 55 432 96 33 23 27 |
| 579 | + 3 2 2 1 2 3 3 4 5 5 6 7 7 7 8 18 45 23 55 432 96 33 23 27 |
| 580 | + 3 2 2 1 2 3 3 4 5 5 6 7 7 7 8 18 45 23 55 432 96 33 23 27 |
| 581 | + 2 1 2 2 3 3 3 4 5 5 6 7 7 7 8 18 45 23 55 432 96 33 23 27 |
| 582 | + 1 2 2 2 3 3 3 4 5 5 6 7 7 7 8 18 45 23 55 432 96 33 23 27 |
| 583 | + 1 2 2 2 3 3 3 4 5 5 6 7 7 7 8 18 45 23 27 432 96 33 23 55 |
| 584 | + 1 2 2 2 3 3 3 4 5 5 6 7 7 7 8 18 45 23 27 23 96 33 432 55 |
| 585 | + 1 2 2 2 3 3 3 4 5 5 6 7 7 7 8 18 45 23 27 23 33 96 432 55 |
| 586 | + 1 2 2 2 3 3 3 4 5 5 6 7 7 7 8 18 23 23 27 33 45 96 55 432 |
| 587 | + 1 2 2 2 3 3 3 4 5 5 6 7 7 7 8 18 23 23 27 33 45 55 96 432 |
| 588 | + |
530 | 589 |
|
531 | 590 |
|
532 | 591 |
|
|
0 commit comments