1 package edu.princeton.cs.algs4;
2 /******************************************************************************
3 * Compilation: javac Insertion.java
4 * Execution: java Insertion < input.txt
5 * Dependencies: StdOut.java StdIn.java
6 * Data files: http://algs4.cs.princeton.edu/21elementary/tiny.txt
7 * http://algs4.cs.princeton.edu/21elementary/words3.txt
8 *
9 * Sorts a sequence of strings from standard input using insertion sort.
10 *
11 * % more tiny.txt
12 * S O R T E X A M P L E
13 *
14 * % java Insertion < tiny.txt
15 * A E E L M O P R S T X [ one string per line ]
16 *
17 * % more words3.txt
18 * bed bug dad yes zoo ... all bad yet
19 *
20 * % java Insertion < words3.txt
21 * all bad bed bug dad ... yes yet zoo [ one string per line ]
22 *
23 ******************************************************************************/
24
25
26
27 import java.util.Comparator;
28
29 /**
30 * The {@code Insertion} class provides static methods for sorting an
31 * array using insertion sort.
32 * <p>
33 * This implementation makes ~ 1/2 n^2 compares and exchanges in
34 * the worst case, so it is not suitable for sorting large arbitrary arrays.
35 * More precisely, the number of exchanges is exactly equal to the number
36 * of inversions. So, for example, it sorts a partially-sorted array
37 * in linear time.
38 * <p>
39 * The sorting algorithm is stable and uses O(1) extra memory.
40 * <p>
41 * See <a href="http://algs4.cs.princeton.edu/21elementary/InsertionPedantic.java.html">InsertionPedantic.java</a>
42 * for a version that eliminates the compiler warning.
43 * <p>
44 * For additional documentation, see <a href="http://algs4.cs.princeton.edu/21elementary">Section 2.1</a> of
45 * <i>Algorithms, 4th Edition</i> by Robert Sedgewick and Kevin Wayne.
46 *
47 * @author Robert Sedgewick
48 * @author Kevin Wayne
49 */
50 public class Insertion {
51
52 // This class should not be instantiated.
53 private Insertion() { }
54
55 /**
56 * Rearranges the array in ascending order, using the natural order.
57 * @param a the array to be sorted
58 */
59 public static void sort(Comparable[] a) {
60 int n = a.length;
61 for (int i = 0; i < n; i++) {
62 for (int j = i; j > 0 && less(a[j], a[j-1]); j--) {
63 exch(a, j, j-1);
64 }
65 assert isSorted(a, 0, i);
66 }
67 assert isSorted(a);
68 }
69
70 /**
71 * Rearranges the subarray a[lo..hi) in ascending order, using the natural order.
72 * @param a the array to be sorted
73 * @param lo left endpoint (inclusive)
74 * @param hi right endpoint (exclusive)
75 */
76 public static void sort(Comparable[] a, int lo, int hi) {
77 for (int i = lo; i < hi; i++) {
78 for (int j = i; j > lo && less(a[j], a[j-1]); j--) {
79 exch(a, j, j-1);
80 }
81 }
82 assert isSorted(a, lo, hi);
83 }
84
85 /**
86 * Rearranges the array in ascending order, using a comparator.
87 * @param a the array
88 * @param comparator the comparator specifying the order
89 */
90 public static void sort(Object[] a, Comparator comparator) {
91 int n = a.length;
92 for (int i = 0; i < n; i++) {
93 for (int j = i; j > 0 && less(a[j], a[j-1], comparator); j--) {
94 exch(a, j, j-1);
95 }
96 assert isSorted(a, 0, i, comparator);
97 }
98 assert isSorted(a, comparator);
99 }
100
101 /**
102 * Rearranges the subarray a[lo..hi) in ascending order, using a comparator.
103 * @param a the array
104 * @param lo left endpoint (inclusive)
105 * @param hi right endpoint (exclusive)
106 * @param comparator the comparator specifying the order
107 */
108 public static void sort(Object[] a, int lo, int hi, Comparator comparator) {
109 for (int i = lo; i < hi; i++) {
110 for (int j = i; j > lo && less(a[j], a[j-1], comparator); j--) {
111 exch(a, j, j-1);
112 }
113 }
114 assert isSorted(a, lo, hi, comparator);
115 }
116
117
118 // return a permutation that gives the elements in a[] in ascending order
119 // do not change the original array a[]
120 /**
121 * Returns a permutation that gives the elements in the array in ascending order.
122 * @param a the array
123 * @return a permutation {@code p[]} such that {@code a[p[0]]}, {@code a[p[1]]},
124 * ..., {@code a[p[n-1]]} are in ascending order
125 */
126 public static int[] indexSort(Comparable[] a) {
127 int n = a.length;
128 int[] index = new int[n];
129 for (int i = 0; i < n; i++)
130 index[i] = i;
131
132 for (int i = 0; i < n; i++)
133 for (int j = i; j > 0 && less(a[index[j]], a[index[j-1]]); j--)
134 exch(index, j, j-1);
135
136 return index;
137 }
138
139 /***************************************************************************
140 * Helper sorting functions.
141 ***************************************************************************/
142
143 // is v < w ?
144 private static boolean less(Comparable v, Comparable w) {
145 return v.compareTo(w) < 0;//若v为a w为b则 v.compareTo(w) < 0为真 因为a为97 b为98
146 } //即a[j]=a,a[j-1]=b也就是b在a的前面则考虑互换位置
147
148 // is v < w ?
149 private static boolean less(Object v, Object w, Comparator comparator) {
150 return comparator.compare(v, w) < 0;
151 }
152
153 // exchange a[i] and a[j]
154 private static void exch(Object[] a, int i, int j) {
155 Object swap = a[i];
156 a[i] = a[j];
157 a[j] = swap;
158 }
159
160 // exchange a[i] and a[j] (for indirect sort)
161 private static void exch(int[] a, int i, int j) {
162 int swap = a[i];
163 a[i] = a[j];
164 a[j] = swap;
165 }
166
167 /***************************************************************************
168 * Check if array is sorted - useful for debugging.
169 ***************************************************************************/
170 private static boolean isSorted(Comparable[] a) {
171 return isSorted(a, 0, a.length);
172 }
173
174 // is the array a[lo..hi) sorted
175 private static boolean isSorted(Comparable[] a, int lo, int hi) {
176 for (int i = lo+1; i < hi; i++)
177 if (less(a[i], a[i-1])) return false;
178 return true;
179 }
180
181 private static boolean isSorted(Object[] a, Comparator comparator) {
182 return isSorted(a, 0, a.length, comparator);
183 }
184
185 // is the array a[lo..hi) sorted
186 private static boolean isSorted(Object[] a, int lo, int hi, Comparator comparator) {
187 for (int i = lo+1; i < hi; i++)
188 if (less(a[i], a[i-1], comparator)) return false;
189 return true;
190 }
191
192 // print array to standard output
193 private static void show(Comparable[] a) {
194 for (int i = 0; i < a.length; i++) {
195 StdOut.println(a[i]);
196 }
197 }
198
199 /**
200 * Reads in a sequence of strings from standard input; insertion sorts them;
201 * and prints them to standard output in ascending order.
202 *
203 * @param args the command-line arguments
204 */
205 public static void main(String[] args) {
206 String[] a = StdIn.readAllStrings();
207 Insertion.sort(a);
208 show(a);
209 }
210 }
211
212 /******************************************************************************
213 * Copyright 2002-2016, Robert Sedgewick and Kevin Wayne.
214 *
215 * This file is part of algs4.jar, which accompanies the textbook
216 *
217 * Algorithms, 4th edition by Robert Sedgewick and Kevin Wayne,
218 * Addison-Wesley Professional, 2011, ISBN 0-321-57351-X.
219 * http://algs4.cs.princeton.edu
220 *
221 *
222 * algs4.jar is free software: you can redistribute it and/or modify
223 * it under the terms of the GNU General Public License as published by
224 * the Free Software Foundation, either version 3 of the License, or
225 * (at your option) any later version.
226 *
227 * algs4.jar is distributed in the hope that it will be useful,
228 * but WITHOUT ANY WARRANTY; without even the implied warranty of
229 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
230 * GNU General Public License for more details.
231 *
232 * You should have received a copy of the GNU General Public License
233 * along with algs4.jar. If not, see http://www.gnu.org/licenses.
234 ******************************************************************************/