先介绍四种排序算法:插入排序、简单选择排序、冒泡排序、归并排序。
插入排序
1 /**
2 * 插入排序,在前k个元素有序的前提下插入arr[k],将前面有序元素依次与arr[k]比较、移动,
3 * 最终将arr[k]插入有序元素中的合适位置,形成k+1个有序元素
4 */
5 @org.junit.Test
6 public void testInsert() {
7 for(int i=1; i<arr.length; i++) {
8 int temp = arr[i];
9 int j = i;
10 for(; j>0&&temp<arr[j-1]; --j) {
11 arr[j] = arr[j - 1];
12 }
13 arr[j] = temp;
14 }
15 }
简单选择排序
1 /**
2 * 简单选择排序,每次遍历选出min与相应位置元素交换,每次遍历都可确定一个元素的最终位置
3 */
4 @org.junit.Test
5 public void testSimpleSelect() {
6 for(int i=0; i<arr.length-1; i++) {
7 int min = i;
8 for(int j=i+1; j<arr.length; j++) {
9 if (arr[min] > arr[j]) {
10 min = j;
11 }
12 }
13 int t = arr[min];
14 arr[min] = arr[i];
15 arr[i] = t;
16 }
17 }
冒泡排序
1 /**
2 * 冒泡排序,与相邻的元素比较大小并交换,每一轮比较都会确定一个元素的最终位置
3 */
4 @org.junit.Test
5 public void testBubble() {
6 for(int i=arr.length-1; i>0; i--) {
7 for(int j=0; j<i; j++) {
8 if (arr[j + 1] < arr[j]) {
9 int t = arr[j + 1];
10 arr[j + 1] = arr[j];
11 arr[j] = t;
12 }
13 }
14 }
15 }
归并排序
1 /**
2 * 归并排序,将n个有序序列合并成k(k<n)个有序序列,可结合其他排序使用,
3 * 即先使用其他排序算法进行小范围排序,然后使用归并排序进行合并。
4 */
5 int i=0, j=0;
6 for(; i<arr.length&&j<arr2.length;) {
7 merged[i+j] = arr[i]>arr2[j]?arr2[j++]:arr[i++];
8 }
9 if (i >= arr.length) {
10 System.arraycopy(arr2, j, merged, j+i, arr2.length-j);
11 }
12 else if (j >= arr2.length) {
13 System.arraycopy(arr, i, merged, j+i, arr.length-i);
14 }