1 public static void radixSort(int[] array) {
2 //首先确定排序的趟数;
3 int max = array[0];
4 for (int i = 1; i < array.length; i++) {
5 if (array[i] > max) {
6 max = array[i];
7 }
8 }
9 int time = 0;
10 //判断位数;
11 while (max > 0) {
12 max /= 10;
13 time++;
14 }
15
16
17 //建立10个队列;
18 ArrayList<ArrayList<Integer>> queue = new ArrayList<>();
19 for (int i = 0; i < 10; i++) {
20 ArrayList<Integer> queue1 = new ArrayList<>();
21 queue.add(queue1);
22 }
23
24
25 //进行time次分配和收集;
26 for (int i = 0; i < time; i++) {
27 //分配数组元素;
28 for (int anArray : array) {
29 //得到数字的第time+1位数;
30 int x = anArray % (int)Math.pow(10, i + 1) / (int)Math.pow(10, i);
31 ArrayList<Integer> queue2 = queue.get(x);
32 queue2.add(anArray);
33 queue.set(x, queue2);
34 }
35 int count = 0;//元素计数器;
36 //收集队列元素;
37 for (int k = 0; k < 10; k++) {
38 while (queue.get(k).size() > 0) {
39 ArrayList<Integer> queue3 = queue.get(k);
40 array[count] = queue3.get(0);
41 queue3.remove(0);
42 count++;
43 }
44 }
45 }
46 System.out.println(Arrays.toString(array) + " radixSort");
47 }
1 package com.test.sort;
2
3 import java.util.ArrayList;
4 import java.util.Arrays;
5
6 @SuppressWarnings("WeakerAccess")
7 public final class SortDemo {
8
9 // 排序原始数据
10 private static final int[] NUMBERS =
11 {49, 38, 65, 97, 76, 13, 27, 78, 34, 12, 64, 5, 4, 62, 99, 98, 54, 56, 17, 18, 23, 34, 15, 35, 25, 53, 51};
12
13
14 public static void main(String[] args) {
15 insertSort(NUMBERS);
16 shellSort(NUMBERS);
17 selectSort(NUMBERS);
18 bubbleSort(NUMBERS);
19 heapSort(NUMBERS);
20 quickSort(NUMBERS);
21 mergingSort(NUMBERS);
22 radixSort(NUMBERS);
23 }
24
25
26 public static void insertSort(int[] array) {
27 for (int i = 1; i < array.length; i++) {
28 int temp = array[i];
29 int j = i - 1;
30 for (; j >= 0 && array[j] > temp; j--) {
31 //将大于temp的值整体后移一个单位
32 array[j + 1] = array[j];
33 }
34 array[j + 1] = temp;
35 }
36 System.out.println(Arrays.toString(array) + " insertSort");
37 }
38
39
40 public static void shellSort(int[] array) {
41 int i;
42 int j;
43 int temp;
44 int gap = 1;
45 int len = array.length;
46 while (gap < len / 3) {
47 gap = gap * 3 + 1;
48 }
49 for (; gap > 0; gap /= 3) {
50 for (i = gap; i < len; i++) {
51 temp = array[i];
52 for (j = i - gap; j >= 0 && array[j] > temp; j -= gap) {
53 array[j + gap] = array[j];
54 }
55 array[j + gap] = temp;
56 }
57 }
58 System.out.println(Arrays.toString(array) + " shellSort");
59 }
60
61 public static void selectSort(int[] array) {
62 int position = 0;
63 for (int i = 0; i < array.length; i++) {
64 int j = i + 1;
65 position = i;
66 int temp = array[i];
67 for (; j < array.length; j++) {
68 if (array[j] < temp) {
69 temp = array[j];
70 position = j;
71 }
72 }
73 array[position] = array[i];
74 array[i] = temp;
75 }
76 System.out.println(Arrays.toString(array) + " selectSort");
77 }
78
79
80 public static void bubbleSort(int[] array) {
81 int temp = 0;
82 for (int i = 0; i < array.length - 1; i++) {
83 for (int j = 0; j < array.length - 1 - i; j++) {
84 if (array[j] > array[j + 1]) {
85 temp = array[j];
86 array[j] = array[j + 1];
87 array[j + 1] = temp;
88 }
89 }
90 }
91 System.out.println(Arrays.toString(array) + " bubbleSort");
92 }
93
94
95 public static void heapSort(int[] array) {
96 /*
97 * 第一步:将数组堆化
98 * beginIndex = 第一个非叶子节点。
99 * 从第一个非叶子节点开始即可。无需从最后一个叶子节点开始。
100 * 叶子节点可以看作已符合堆要求的节点,根节点就是它自己且自己以下值为最大。
101 */
102 int len = array.length - 1;
103 int beginIndex = (len - 1) >> 1;
104 for (int i = beginIndex; i >= 0; i--) {
105 maxHeapify(i, len, array);
106 }
107 /*
108 * 第二步:对堆化数据排序
109 * 每次都是移出最顶层的根节点A[0],与最尾部节点位置调换,同时遍历长度 - 1。
110 * 然后从新整理被换到根节点的末尾元素,使其符合堆的特性。
111 * 直至未排序的堆长度为 0。
112 */
113 for (int i = len; i > 0; i--) {
114 swap(0, i, array);
115 maxHeapify(0, i - 1, array);
116 }
117 System.out.println(Arrays.toString(array) + " heapSort");
118 }
119
120 private static void swap(int i, int j, int[] arr) {
121 int temp = arr[i];
122 arr[i] = arr[j];
123 arr[j] = temp;
124 }
125
126 /**
127 * 调整索引为 index 处的数据,使其符合堆的特性。
128 *
129 * @param index 需要堆化处理的数据的索引
130 * @param len 未排序的堆(数组)的长度
131 */
132 private static void maxHeapify(int index, int len, int[] arr) {
133 int li = (index << 1) + 1; // 左子节点索引
134 int ri = li + 1; // 右子节点索引
135 int cMax = li; // 子节点值最大索引,默认左子节点。
136 if (li > len) {
137 return; // 左子节点索引超出计算范围,直接返回。
138 }
139 if (ri <= len && arr[ri] > arr[li]) // 先判断左右子节点,哪个较大。
140 {
141 cMax = ri;
142 }
143 if (arr[cMax] > arr[index]) {
144 swap(cMax, index, arr); // 如果父节点被子节点调换,
145 maxHeapify(cMax, len, arr); // 则需要继续判断换下后的父节点是否符合堆的特性。
146 }
147 }
148
149
150 public static void quickSort(int[] array) {
151 _quickSort(array, 0, array.length - 1);
152 System.out.println(Arrays.toString(array) + " quickSort");
153 }
154
155
156 private static int getMiddle(int[] list, int low, int high) {
157 int tmp = list[low]; //数组的第一个作为中轴
158 while (low < high) {
159 while (low < high && list[high] >= tmp) {
160 high--;
161 }
162
163
164 list[low] = list[high]; //比中轴小的记录移到低端
165 while (low < high && list[low] <= tmp) {
166 low++;
167 }
168
169
170 list[high] = list[low]; //比中轴大的记录移到高端
171 }
172 list[low] = tmp; //中轴记录到尾
173 return low; //返回中轴的位置
174 }
175
176
177 private static void _quickSort(int[] list, int low, int high) {
178 if (low < high) {
179 int middle = getMiddle(list, low, high); //将list数组进行一分为二
180 _quickSort(list, low, middle - 1); //对低字表进行递归排序
181 _quickSort(list, middle + 1, high); //对高字表进行递归排序
182 }
183 }
184
185
186 public static void mergingSort(int[] array) {
187 sort(array, 0, array.length - 1);
188 System.out.println(Arrays.toString(array) + " mergingSort");
189 }
190
191 private static void sort(int[] data, int left, int right) {
192 if (left < right) {
193 //找出中间索引
194 int center = (left + right) / 2;
195 //对左边数组进行递归
196 sort(data, left, center);
197 //对右边数组进行递归
198 sort(data, center + 1, right);
199 //合并
200 merge(data, left, center, right);
201 }
202 }
203
204 private static void merge(int[] data, int left, int center, int right) {
205 int[] tmpArr = new int[data.length];
206 int mid = center + 1;
207 //third记录中间数组的索引
208 int third = left;
209 int tmp = left;
210 while (left <= center && mid <= right) {
211 //从两个数组中取出最小的放入中间数组
212 if (data[left] <= data[mid]) {
213 tmpArr[third++] = data[left++];
214 } else {
215 tmpArr[third++] = data[mid++];
216 }
217 }
218
219 //剩余部分依次放入中间数组
220 while (mid <= right) {
221 tmpArr[third++] = data[mid++];
222 }
223
224 while (left <= center) {
225 tmpArr[third++] = data[left++];
226 }
227
228 //将中间数组中的内容复制回原数组
229 while (tmp <= right) {
230 data[tmp] = tmpArr[tmp++];
231 }
232 }
233
234
235 public static void radixSort(int[] array) {
236 //首先确定排序的趟数;
237 int max = array[0];
238 for (int i = 1; i < array.length; i++) {
239 if (array[i] > max) {
240 max = array[i];
241 }
242 }
243 int time = 0;
244 //判断位数;
245 while (max > 0) {
246 max /= 10;
247 time++;
248 }
249
250
251 //建立10个队列;
252 ArrayList<ArrayList<Integer>> queue = new ArrayList<>();
253 for (int i = 0; i < 10; i++) {
254 ArrayList<Integer> queue1 = new ArrayList<>();
255 queue.add(queue1);
256 }
257
258
259 //进行time次分配和收集;
260 for (int i = 0; i < time; i++) {
261 //分配数组元素;
262 for (int anArray : array) {
263 //得到数字的第time+1位数;
264 int x = anArray % (int) Math.pow(10, i + 1) / (int) Math.pow(10, i);
265 ArrayList<Integer> queue2 = queue.get(x);
266 queue2.add(anArray);
267 queue.set(x, queue2);
268 }
269 int count = 0;//元素计数器;
270 //收集队列元素;
271 for (int k = 0; k < 10; k++) {
272 while (queue.get(k).size() > 0) {
273 ArrayList<Integer> queue3 = queue.get(k);
274 array[count] = queue3.get(0);
275 queue3.remove(0);
276 count++;
277 }
278 }
279 }
280 System.out.println(Arrays.toString(array) + " radixSort");
281 }
282 }