排序算法
2016-08-11 10:51
393 查看
1.交换排序
冒泡排序
package 排序算法; import java.util.Arrays; public class 冒泡排序算法 { public static void main(String[] args) { int[] a = { -10, 21, 20, 38, 27, 1, 3, 6, 3, 1 }; System.out.println(Arrays.toString(a)); bubbleSort(a); System.out.println(Arrays.toString(a)); } public static void bubbleSort(int[] a) { for (int i = 0; i < a.length; i++) { for (int j = i + 1; j < a.length; j++) { if (a[i] > a[j]) { a[i] = a[i] ^ a[j]; a[j] = a[i] ^ a[j]; a[i] = a[i] ^ a[j]; } } } } }
快速排序1
package 排序算法; import java.util.Arrays; public class 快速排序算法 { public static void main(String[] args) { int[] a = { 5, 6, 4, 6, 3, 5, 2, 7, 1 }; System.out.println(Arrays.toString(a)); quickSort(a); System.out.println(Arrays.toString(a)); } public static int partition(int[] a, int l, int r) { int i = l, j = r, x = a[l]; while (i < j) { while (i < j && a[j] > x) j--; if (i < j) a[i++] = a[j]; while (i < j && a[i] < x) i++; if (i < j) a[j--] = a[i]; } a[i] = x; return i; } public static void quick_sort(int[] a, int l, int r) { if (l < r) { int i = partition(a, l, r); quick_sort(a, l, i - 1); quick_sort(a, i + 1, r); } } public static void quickSort(int[] a) { if (a.length > 0) quick_sort(a, 0, a.length - 1); } }
快速排序2
package 排序算法; import java.util.Arrays; public class 快速排序算法2 { public static void main(String[] args) { int[] a = { 5, 6, 4, 1, 6, 3, 5, 2, 7, 1 }; System.out.println(Arrays.toString(a)); quickSort(a); System.out.println(Arrays.toString(a)); } public static void quick_sort(int[] a, int l, int r) { int i = l, j = r; if (l < r) { int x = a[l]; while (i != j) { while (i < j && a[j] > x) j--; if (i < j) a[i++] = a[j]; while (i < j && a[i] < x) i++; if (i < j) a[j--] = a[i]; } a[i] = x; quick_sort(a, l, i - 1); quick_sort(a, i + 1, r); } } public static void quickSort(int[] a) { if (a.length > 0) quick_sort(a, 0, a.length - 1); } }
奇偶排序
package 排序算法; import java.util.Arrays; public class 奇偶排序算法 { public static void main(String[] args) { int[] a = { 9, 1, 5, 3, 4, 2, 6, 8, 7, 1, 5 }; System.out.println(Arrays.toString(a)); odd_even_sort(a); System.out.println(Arrays.toString(a)); } private static void odd_even_sort(int[] a) { boolean flag = false; while (!flag) { // 循环结束条件 flag = true; // 奇偶位控制 for (int odd_even = 0; odd_even < 2; odd_even++) // 所有的奇数位||所有的偶数位 for (int i = odd_even; i < a.length - 1; i += 2) // 所有奇数位和邻居比较 if (a[i] > a[i + 1]) { swap(a, i, i + 1); // 循环继续条件 flag = false; } } } private static void swap(int[] a, int i, int j) { a[i] = a[i] ^ a[j]; a[j] = a[i] ^ a[j]; a[i] = a[i] ^ a[j]; } }
鸡尾酒排序
package 排序算法; import java.util.Arrays; public class 鸡尾酒排序算法 { public static void main(String[] args) { int[] a = { 5, 6, 4, 6, 3, 5, 2, 7, 1 }; System.out.println(Arrays.toString(a)); cooktail_sort(a); System.out.println(Arrays.toString(a)); } public static void cooktail_sort(int[] a) { int l = 0, r = a.length - 1; while (l < r) { for (int i = l; i < r; i++) { if (a[i] > a[i + 1]) swap(a, i, i + 1); } r--; for (int j = r; j >= l; j--) { if (a[j] > a[j + 1]) swap(a, j, j + 1); } l++; } } public static void swap(int[] a, int i, int j) { a[i] = a[i] ^ a[j]; a[j] = a[i] ^ a[j]; a[i] = a[i] ^ a[j]; } }
2.选择排序
直接选择排序
package 排序算法; import java.util.Arrays; public class 选择排序算法 { public static void main(String[] args) { int[] a = { 5, 6, 4, 6, 3, 5, 2, 7, 1 }; System.out.println(Arrays.toString(a)); selection_sort(a); System.out.println(Arrays.toString(a)); } public static void selection_sort(int[] a) { for (int i = 0; i < a.length - 1; i++) { int min = i; for (int j = i + 1; j < a.length; j++) { if (a[min] >= a[j]) min = j; } if (min != i) swap(a, min, i); } } public static void swap(int[] a, int i, int j) { a[i] = a[i] ^ a[j]; a[j] = a[i] ^ a[j]; a[i] = a[i] ^ a[j]; } }
3.插入排序
直接插入排序
package 排序算法; import java.util.Arrays; public class 直接插入排序算法 { public static void main(String[] args) { int[] a = { 6, 4, 7, 4, 73, 8, 23 }; System.out.println(Arrays.toString(a)); insertSort(a); System.out.println(Arrays.toString(a)); } public static void insertSort(int[] a) { for (int i = 1; i < a.length; i++) { if (a[i] < a[i - 1]) { int x = a[i], k = i - 1; for (int j = k; j >= 0 && a[j] > x; j--) { a[j + 1] = a[j]; k--; } a[k + 1] = x; } } } }
希尔排序1
package 排序算法; import java.util.Arrays; public class 希尔排序算法 { public static void main(String[] args) { int[] a = { 5, 3, 7, 3, 7, 32, 7, 4, 23, 12, 6, 8 }; System.out.println(Arrays.toString(a)); shell_sort(a); System.out.println(Arrays.toString(a)); } public static void shell_sort(int[] a) { // 分组 for (int g = a.length / 2; g > 0; g /= 2) { // 对每个组进行操作 for (int i = 0; i < g; i++) { // 组内操作,相当于直接插入排序的外层循环 for (int j = i + g; j < a.length; j += g) { // 相邻的比较 if (a[j] < a[j - g]) { int x = a[j]; int k = j - g; while (k >= 0 && a[k] > x) { a[k + g] = a[k]; k -= g; } a[k + g] = x; } } // 组内操作 } // 组内 } // 分组 } }
希尔排序2
package 排序算法; import java.util.Arrays; public class 希尔排序算法2 { public static void main(String[] args) { int[] a = { 5, 3, 7, 3, 7, 32, 7, 4, 23, 12, 6, 8, 5, 3, 7, 3, 7 }; System.out.println(Arrays.toString(a)); shell_sort(a); System.out.println(Arrays.toString(a)); } public static void shell_sort(int[] a) { for (int g = a.length / 2; g > 0; g /= 2) { for (int j = g; j < a.length; j++) { if (a[j] < a[j - g]) { int x = a[j], k = j - g; while (k >= 0 && a[k] > x) { a[k + g] = a[k]; k -= g; } a[k + g] = x; } } } } }
希尔排序3
package 排序算法; import java.util.Arrays; public class 希尔排序算法3 { public static void main(String[] args) { int[] a = { 5, 3, 7, 3, 7, 32, 7, 4, 23, 12, 6, 8, 5, 3, 7, 3, 7 }; System.out.println(Arrays.toString(a)); shell_sort(a); System.out.println(Arrays.toString(a)); } public static void shell_sort(int[] a) { for (int g = a.length / 2; g > 0; g /= 2) for (int i = g; i < a.length; i++) for (int j = i - g; j >= 0 && a[j] > a[j + g]; j -= g) swap(a, j, j + g); } public static void swap(int[] a, int i, int j) { a[i] = a[i] ^ a[j]; a[j] = a[i] ^ a[j]; a[i] = a[i] ^ a[j]; } }
4.归并排序
数组归并
package 排序算法; import java.util.Arrays; public class 归并数组 { public static void main(String[] args) { int[] a = { 5, 4, 3, 2, 1 }; int[] b = { 12, 11, 10, 9, 8, 7, 6 }; int[] c = new int[12]; System.out.println(Arrays.toString(a)); System.out.println(Arrays.toString(b)); merge_array(a, b, c); System.out.println(Arrays.toString(c)); } private static void merge_array(int[] a, int[] b, int[] c) { int i, j, k; i = j = k = 0; while (i < a.length && j < b.length) { if (a[i] < b[j]) c[k++] = a[i++]; else c[k++] = b[j++]; } while (i < a.length) c[k++] = a[i++]; while (j < b.length) c[k++] = b[j++]; } }
归并排序
package 默写排序算法; import java.util.Arrays; public class 归并排序算法 { public static void main(String[] args) { int[] a = { 6, 7, 8, 5, 2, 34, 7, 3, 7, 23, 6, 2, 2 }; System.out.println(Arrays.toString(a)); merge_sort(a); System.out.println(Arrays.toString(a)); } private static void merge(int[] a, int l, int m, int r) { int i = l, j = m + 1, k = 0; int[] x = new int[r - l + 1]; while (i <= m && j <= r) { if (a[i] <= a[j]) x[k++] = a[i++]; else x[k++] = a[j++]; } while (i <= m) x[k++] = a[i++]; while (j <= r) x[k++] = a[j++]; for (k = 0, i = l; i <= r; i++, k++) a[i] = x[k]; } public static void merge_gap(int[] a, int g) { int i = 0; for (i = 0; i + 2 * g - 1 < a.length; i += 2 * g) merge(a, i, i + g - 1, i + 2 * g - 1); if (i + g - 1 < a.length) merge(a, i, i + g - 1, a.length - 1); } private static void merge_sort(int[] a) { for (int g = 1; g < a.length; g *= 2) merge_gap(a, g); } }
5.java自带排序API
package 排序算法; import java.util.Arrays; public class Java自带的排序api { public static void main(String[] args) { Integer[] a = { 5, 3, 7, 3, 7, 32, 7, 4, 23, 12, 6, 8, 5, 3, 7, 3, 7 }; System.out.println(Arrays.toString(a)); Arrays.sort(a); System.out.println(Arrays.toString(a)); } }