| 1 7 8 package java.util; 9 10 import java.lang.reflect.*; 11 12 39 40 public class Arrays { 41 private Arrays() { 43 } 44 45 47 57 public static void sort(long[] a) { 58 sort1(a, 0, a.length); 59 } 60 61 81 public static void sort(long[] a, int fromIndex, int toIndex) { 82 rangeCheck(a.length, fromIndex, toIndex); 83 sort1(a, fromIndex, toIndex-fromIndex); 84 } 85 86 96 public static void sort(int[] a) { 97 sort1(a, 0, a.length); 98 } 99 100 120 public static void sort(int[] a, int fromIndex, int toIndex) { 121 rangeCheck(a.length, fromIndex, toIndex); 122 sort1(a, fromIndex, toIndex-fromIndex); 123 } 124 125 135 public static void sort(short[] a) { 136 sort1(a, 0, a.length); 137 } 138 139 159 public static void sort(short[] a, int fromIndex, int toIndex) { 160 rangeCheck(a.length, fromIndex, toIndex); 161 sort1(a, fromIndex, toIndex-fromIndex); 162 } 163 164 174 public static void sort(char[] a) { 175 sort1(a, 0, a.length); 176 } 177 178 198 public static void sort(char[] a, int fromIndex, int toIndex) { 199 rangeCheck(a.length, fromIndex, toIndex); 200 sort1(a, fromIndex, toIndex-fromIndex); 201 } 202 203 213 public static void sort(byte[] a) { 214 sort1(a, 0, a.length); 215 } 216 217 237 public static void sort(byte[] a, int fromIndex, int toIndex) { 238 rangeCheck(a.length, fromIndex, toIndex); 239 sort1(a, fromIndex, toIndex-fromIndex); 240 } 241 242 267 public static void sort(double[] a) { 268 sort2(a, 0, a.length); 269 } 270 271 305 public static void sort(double[] a, int fromIndex, int toIndex) { 306 rangeCheck(a.length, fromIndex, toIndex); 307 sort2(a, fromIndex, toIndex); 308 } 309 310 335 public static void sort(float[] a) { 336 sort2(a, 0, a.length); 337 } 338 339 373 public static void sort(float[] a, int fromIndex, int toIndex) { 374 rangeCheck(a.length, fromIndex, toIndex); 375 sort2(a, fromIndex, toIndex); 376 } 377 378 private static void sort2(double a[], int fromIndex, int toIndex) { 379 final long NEG_ZERO_BITS = Double.doubleToLongBits(-0.0d); 380 384 385 389 int numNegZeros = 0; 390 int i = fromIndex, n = toIndex; 391 while(i < n) { 392 if (a[i] != a[i]) { 393 double swap = a[i]; 394 a[i] = a[--n]; 395 a[n] = swap; 396 } else { 397 if (a[i]==0 && Double.doubleToLongBits(a[i])==NEG_ZERO_BITS) { 398 a[i] = 0.0d; 399 numNegZeros++; 400 } 401 i++; 402 } 403 } 404 405 sort1(a, fromIndex, n-fromIndex); 407 408 if (numNegZeros != 0) { 410 int j = binarySearch(a, 0.0d, fromIndex, n-1); do { 412 j--; 413 } while (j>=0 && a[j]==0.0d); 414 415 for (int k=0; k<numNegZeros; k++) 417 a[++j] = -0.0d; 418 } 419 } 420 421 422 private static void sort2(float a[], int fromIndex, int toIndex) { 423 final int NEG_ZERO_BITS = Float.floatToIntBits(-0.0f); 424 428 429 433 int numNegZeros = 0; 434 int i = fromIndex, n = toIndex; 435 while(i < n) { 436 if (a[i] != a[i]) { 437 float swap = a[i]; 438 a[i] = a[--n]; 439 a[n] = swap; 440 } else { 441 if (a[i]==0 && Float.floatToIntBits(a[i])==NEG_ZERO_BITS) { 442 a[i] = 0.0f; 443 numNegZeros++; 444 } 445 i++; 446 } 447 } 448 449 sort1(a, fromIndex, n-fromIndex); 451 452 if (numNegZeros != 0) { 454 int j = binarySearch(a, 0.0f, fromIndex, n-1); do { 456 j--; 457 } while (j>=0 && a[j]==0.0f); 458 459 for (int k=0; k<numNegZeros; k++) 461 a[++j] = -0.0f; 462 } 463 } 464 465 466 470 471 474 private static void sort1(long x[], int off, int len) { 475 if (len < 7) { 477 for (int i=off; i<len+off; i++) 478 for (int j=i; j>off && x[j-1]>x[j]; j--) 479 swap(x, j, j-1); 480 return; 481 } 482 483 int m = off + (len >> 1); if (len > 7) { 486 int l = off; 487 int n = off + len - 1; 488 if (len > 40) { int s = len/8; 490 l = med3(x, l, l+s, l+2*s); 491 m = med3(x, m-s, m, m+s); 492 n = med3(x, n-2*s, n-s, n); 493 } 494 m = med3(x, l, m, n); } 496 long v = x[m]; 497 498 int a = off, b = a, c = off + len - 1, d = c; 500 while(true) { 501 while (b <= c && x[b] <= v) { 502 if (x[b] == v) 503 swap(x, a++, b); 504 b++; 505 } 506 while (c >= b && x[c] >= v) { 507 if (x[c] == v) 508 swap(x, c, d--); 509 c--; 510 } 511 if (b > c) 512 break; 513 swap(x, b++, c--); 514 } 515 516 int s, n = off + len; 518 s = Math.min(a-off, b-a ); vecswap(x, off, b-s, s); 519 s = Math.min(d-c, n-d-1); vecswap(x, b, n-s, s); 520 521 if ((s = b-a) > 1) 523 sort1(x, off, s); 524 if ((s = d-c) > 1) 525 sort1(x, n-s, s); 526 } 527 528 531 private static void swap(long x[], int a, int b) { 532 long t = x[a]; 533 x[a] = x[b]; 534 x[b] = t; 535 } 536 537 540 private static void vecswap(long x[], int a, int b, int n) { 541 for (int i=0; i<n; i++, a++, b++) 542 swap(x, a, b); 543 } 544 545 548 private static int med3(long x[], int a, int b, int c) { 549 return (x[a] < x[b] ? 550 (x[b] < x[c] ? b : x[a] < x[c] ? c : a) : 551 (x[b] > x[c] ? b : x[a] > x[c] ? c : a)); 552 } 553 554 557 private static void sort1(int x[], int off, int len) { 558 if (len < 7) { 560 for (int i=off; i<len+off; i++) 561 for (int j=i; j>off && x[j-1]>x[j]; j--) 562 swap(x, j, j-1); 563 return; 564 } 565 566 int m = off + (len >> 1); if (len > 7) { 569 int l = off; 570 int n = off + len - 1; 571 if (len > 40) { int s = len/8; 573 l = med3(x, l, l+s, l+2*s); 574 m = med3(x, m-s, m, m+s); 575 n = med3(x, n-2*s, n-s, n); 576 } 577 m = med3(x, l, m, n); } 579 int v = x[m]; 580 581 int a = off, b = a, c = off + len - 1, d = c; 583 while(true) { 584 while (b <= c && x[b] <= v) { 585 if (x[b] == v) 586 swap(x, a++, b); 587 b++; 588 } 589 while (c >= b && x[c] >= v) { 590 if (x[c] == v) 591 swap(x, c, d--); 592 c--; 593 } 594 if (b > c) 595 break; 596 swap(x, b++, c--); 597 } 598 599 int s, n = off + len; 601 s = Math.min(a-off, b-a ); vecswap(x, off, b-s, s); 602 s = Math.min(d-c, n-d-1); vecswap(x, b, n-s, s); 603 604 if ((s = b-a) > 1) 606 sort1(x, off, s); 607 if ((s = d-c) > 1) 608 sort1(x, n-s, s); 609 } 610 611 614 private static void swap(int x[], int a, int b) { 615 int t = x[a]; 616 x[a] = x[b]; 617 x[b] = t; 618 } 619 620 623 private static void vecswap(int x[], int a, int b, int n) { 624 for (int i=0; i<n; i++, a++, b++) 625 swap(x, a, b); 626 } 627 628 631 private static int med3(int x[], int a, int b, int c) { 632 return (x[a] < x[b] ? 633 (x[b] < x[c] ? b : x[a] < x[c] ? c : a) : 634 (x[b] > x[c] ? b : x[a] > x[c] ? c : a)); 635 } 636 637 640 private static void sort1(short x[], int off, int len) { 641 if (len < 7) { 643 for (int i=off; i<len+off; i++) 644 for (int j=i; j>off && x[j-1]>x[j]; j--) 645 swap(x, j, j-1); 646 return; 647 } 648 649 int m = off + (len >> 1); if (len > 7) { 652 int l = off; 653 int n = off + len - 1; 654 if (len > 40) { int s = len/8; 656 l = med3(x, l, l+s, l+2*s); 657 m = med3(x, m-s, m, m+s); 658 n = med3(x, n-2*s, n-s, n); 659 } 660 m = med3(x, l, m, n); } 662 short v = x[m]; 663 664 int a = off, b = a, c = off + len - 1, d = c; 666 while(true) { 667 while (b <= c && x[b] <= v) { 668 if (x[b] == v) 669 swap(x, a++, b); 670 b++; 671 } 672 while (c >= b && x[c] >= v) { 673 if (x[c] == v) 674 swap(x, c, d--); 675 c--; 676 } 677 if (b > c) 678 break; 679 swap(x, b++, c--); 680 } 681 682 int s, n = off + len; 684 s = Math.min(a-off, b-a ); vecswap(x, off, b-s, s); 685 s = Math.min(d-c, n-d-1); vecswap(x, b, n-s, s); 686 687 if ((s = b-a) > 1) 689 sort1(x, off, s); 690 if ((s = d-c) > 1) 691 sort1(x, n-s, s); 692 } 693 694 697 private static void swap(short x[], int a, int b) { 698 short t = x[a]; 699 x[a] = x[b]; 700 x[b] = t; 701 } 702 703 706 private static void vecswap(short x[], int a, int b, int n) { 707 for (int i=0; i<n; i++, a++, b++) 708 swap(x, a, b); 709 } 710 711 714 private static int med3(short x[], int a, int b, int c) { 715 return (x[a] < x[b] ? 716 (x[b] < x[c] ? b : x[a] < x[c] ? c : a) : 717 (x[b] > x[c] ? b : x[a] > x[c] ? c : a)); 718 } 719 720 721 724 private static void sort1(char x[], int off, int len) { 725 if (len < 7) { 727 for (int i=off; i<len+off; i++) 728 for (int j=i; j>off && x[j-1]>x[j]; j--) 729 swap(x, j, j-1); 730 return; 731 } 732 733 int m = off + (len >> 1); if (len > 7) { 736 int l = off; 737 int n = off + len - 1; 738 if (len > 40) { int s = len/8; 740 l = med3(x, l, l+s, l+2*s); 741 m = med3(x, m-s, m, m+s); 742 n = med3(x, n-2*s, n-s, n); 743 } 744 m = med3(x, l, m, n); } 746 char v = x[m]; 747 748 int a = off, b = a, c = off + len - 1, d = c; 750 while(true) { 751 while (b <= c && x[b] <= v) { 752 if (x[b] == v) 753 swap(x, a++, b); 754 b++; 755 } 756 while (c >= b && x[c] >= v) { 757 if (x[c] == v) 758 swap(x, c, d--); 759 c--; 760 } 761 if (b > c) 762 break; 763 swap(x, b++, c--); 764 } 765 766 int s, n = off + len; 768 s = Math.min(a-off, b-a ); vecswap(x, off, b-s, s); 769 s = Math.min(d-c, n-d-1); vecswap(x, b, n-s, s); 770 771 if ((s = b-a) > 1) 773 sort1(x, off, s); 774 if ((s = d-c) > 1) 775 sort1(x, n-s, s); 776 } 777 778 781 private static void swap(char x[], int a, int b) { 782 char t = x[a]; 783 x[a] = x[b]; 784 x[b] = t; 785 } 786 787 790 private static void vecswap(char x[], int a, int b, int n) { 791 for (int i=0; i<n; i++, a++, b++) 792 swap(x, a, b); 793 } 794 795 798 private static int med3(char x[], int a, int b, int c) { 799 return (x[a] < x[b] ? 800 (x[b] < x[c] ? b : x[a] < x[c] ? c : a) : 801 (x[b] > x[c] ? b : x[a] > x[c] ? c : a)); 802 } 803 804 805 808 private static void sort1(byte x[], int off, int len) { 809 if (len < 7) { 811 for (int i=off; i<len+off; i++) 812 for (int j=i; j>off && x[j-1]>x[j]; j--) 813 swap(x, j, j-1); 814 return; 815 } 816 817 int m = off + (len >> 1); if (len > 7) { 820 int l = off; 821 int n = off + len - 1; 822 if (len > 40) { int s = len/8; 824 l = med3(x, l, l+s, l+2*s); 825 m = med3(x, m-s, m, m+s); 826 n = med3(x, n-2*s, n-s, n); 827 } 828 m = med3(x, l, m, n); } 830 byte v = x[m]; 831 832 int a = off, b = a, c = off + len - 1, d = c; 834 while(true) { 835 while (b <= c && x[b] <= v) { 836 if (x[b] == v) 837 swap(x, a++, b); 838 b++; 839 } 840 while (c >= b && x[c] >= v) { 841 if (x[c] == v) 842 swap(x, c, d--); 843 c--; 844 } 845 if (b > c) 846 break; 847 swap(x, b++, c--); 848 } 849 850 int s, n = off + len; 852 s = Math.min(a-off, b-a ); vecswap(x, off, b-s, s); 853 s = Math.min(d-c, n-d-1); vecswap(x, b, n-s, s); 854 855 if ((s = b-a) > 1) 857 sort1(x, off, s); 858 if ((s = d-c) > 1) 859 sort1(x, n-s, s); 860 } 861 862 865 private static void swap(byte x[], int a, int b) { 866 byte t = x[a]; 867 x[a] = x[b]; 868 x[b] = t; 869 } 870 871 874 private static void vecswap(byte x[], int a, int b, int n) { 875 for (int i=0; i<n; i++, a++, b++) 876 swap(x, a, b); 877 } 878 879 882 private static int med3(byte x[], int a, int b, int c) { 883 return (x[a] < x[b] ? 884 (x[b] < x[c] ? b : x[a] < x[c] ? c : a) : 885 (x[b] > x[c] ? b : x[a] > x[c] ? c : a)); 886 } 887 888 889 892 private static void sort1(double x[], int off, int len) { 893 if (len < 7) { 895 for (int i=off; i<len+off; i++) 896 for (int j=i; j>off && x[j-1]>x[j]; j--) 897 swap(x, j, j-1); 898 return; 899 } 900 901 int m = off + (len >> 1); if (len > 7) { 904 int l = off; 905 int n = off + len - 1; 906 if (len > 40) { int s = len/8; 908 l = med3(x, l, l+s, l+2*s); 909 m = med3(x, m-s, m, m+s); 910 n = med3(x, n-2*s, n-s, n); 911 } 912 m = med3(x, l, m, n); } 914 double v = x[m]; 915 916 int a = off, b = a, c = off + len - 1, d = c; 918 while(true) { 919 while (b <= c && x[b] <= v) { 920 if (x[b] == v) 921 swap(x, a++, b); 922 b++; 923 } 924 while (c >= b && x[c] >= v) { 925 if (x[c] == v) 926 swap(x, c, d--); 927 c--; 928 } 929 if (b > c) 930 break; 931 swap(x, b++, c--); 932 } 933 934 int s, n = off + len; 936 s = Math.min(a-off, b-a ); vecswap(x, off, b-s, s); 937 s = Math.min(d-c, n-d-1); vecswap(x, b, n-s, s); 938 939 if ((s = b-a) > 1) 941 sort1(x, off, s); 942 if ((s = d-c) > 1) 943 sort1(x, n-s, s); 944 } 945 946 949 private static void swap(double x[], int a, int b) { 950 double t = x[a]; 951 x[a] = x[b]; 952 x[b] = t; 953 } 954 955 958 private static void vecswap(double x[], int a, int b, int n) { 959 for (int i=0; i<n; i++, a++, b++) 960 swap(x, a, b); 961 } 962 963 966 private static int med3(double x[], int a, int b, int c) { 967 return (x[a] < x[b] ? 968 (x[b] < x[c] ? b : x[a] < x[c] ? c : a) : 969 (x[b] > x[c] ? b : x[a] > x[c] ? c : a)); 970 } 971 972 973 976 private static void sort1(float x[], int off, int len) { 977 if (len < 7) { 979 for (int i=off; i<len+off; i++) 980 for (int j=i; j>off && x[j-1]>x[j]; j--) 981 swap(x, j, j-1); 982 return; 983 } 984 985 int m = off + (len >> 1); if (len > 7) { 988 int l = off; 989 int n = off + len - 1; 990 if (len > 40) { int s = len/8; 992 l = med3(x, l, l+s, l+2*s); 993 m = med3(x, m-s, m, m+s); 994 n = med3(x, n-2*s, n-s, n); 995 } 996 m = med3(x, l, m, n); } 998 float v = x[m]; 999 1000 int a = off, b = a, c = off + len - 1, d = c; 1002 while(true) { 1003 while (b <= c && x[b] <= v) { 1004
|