1 /**
2 * Java常用排序
3 * @author LiTaiQing
4 *
5 */
6 public class SortTest {
7
8 /*
9 * 直接插入排序
10 * 基本思想:
11 * 在要排序的一组数中,假设前面(n-1)[n>=2] 个数已经是排好顺序的,
12 * 现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的。
13 * 如此反复循环,直到全部排好顺序
14 */
15 public static void insertSort(int[] arr){
16 for(int i = 1; i < arr.length; i++){
17 int j = i -1;
18 for(;j > 0 && arr[i] < arr[j];j--){
19 arr[j+1] = arr[j];
20 }
21 arr[j+1] = arr[i];
22 }
23 }
24
25 /*
26 * 简单快速排序
27 * 基本思想:
28 * 在要排序的一组数中,选出最小的一个数与第一个位置的数交换;
29 * 然后在剩下的数当中再找最小的与第二个位置的数交换,
30 * 如此循环到倒数第二个数和最后一个数比较为止。
31 */
32 public static void selectSort(int[] arr){
33 for(int i = 0; i < arr.length - 1; i++){
34 for(int j = i + 1;j < arr.length ; j++){
35 if(arr[i] > arr[j]){
36 arr[i] ^= arr[j];
37 arr[j] ^= arr[i];
38 arr[i] ^= arr[j];
39 }
40 }
41 }
42 }
43
44 /*
45 * 冒泡排序
46 * 基本思想:
47 * 在要排序的一组数中,对当前还未排好序的范围内的全部数,
48 * 自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。
49 * 即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。
50 */
51 public static void bubbleSort(int[] arr){
52 for(int i = 0; i < arr.length - 1; i++){
53 for(int j = 0; j < arr.length - 1 - i; j++){
54 if(arr[j] > arr[j+1]){
55 arr[j] += arr[j+1];
56 arr[j+1] = arr[j] - arr[j+1];
57 arr[j] -= arr[j+1];
58 }
59 }
60 }
61 }
62
63 /*
64 * 希尔排序(最小增量排序)
65 * 基本思想:
66 * 算法先将要排序的一组数按某个增量d(n/2,n为要排序数的个数)分成若干组,
67 * 每组中记录的下标相差d.对每组中全部元素进行直接插入排序,
68 * 然后再用一个较小的增量(d/2)对它进行分组,在每组中再进行直接插入排序。
69 * 当增量减到1时,进行直接插入排序后,排序完成。
70 */
71 public static void shellSort(int[] arr){
72 int j = 0;
73 int temp = 0;
74 for (int increment = arr.length / 2; increment > 0; increment /= 2) {
75 for (int i = increment; i < arr.length; i++) {
76 temp = arr[i];
77 for (j = i; j >= increment; j -= increment) {
78 if(temp > arr[j - increment]){
79 arr[j] = arr[j - increment];
80 }else{
81 break;
82 }
83 }
84 arr[j] = temp;
85 }
86 }
87 }
88
89 /*
90 * 输出
91 */
92 public static void out(int[] arr){
93 System.out.print("[");
94 for(int i =0; i < arr.length - 2; i++){
95 System.out.print(arr[i]+",");
96 }
97 System.out.println(arr[arr.length-1]+"]");
98 }
99
100 }