插入排序与选择排序都是比较简单也费时的算法,以下是图示区别以及简单的代码:
public class Sort {
/**
* 【插入排序:O(n^2)】
* 基本思想: 在要排序的一组数中,假设前面(n-1) [n>=2] 个数已经是排好顺序的,
* 现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的, 如此反复循环,直到全部排好顺序。
*/
public void insertSort(int[] arr) {
for (int i = 1; i < arr.length; i++) {//从第二个数开始遍历
int j = i - 1;//待插入数的前一个坐标(将被向前遍历至0位)
int temp = arr[i];//待插入数
for (; j >= 0 && temp < arr[j]; j--) {//如果temp小于被比数,该被比数应该通过克隆后退一位(+1);否则后一位应该就是temp,且应该退出循环
arr[j + 1] = arr[j]; // 将大于temp的值整体后移一个单位
}
arr[j + 1] = temp;
}
}
/*
* 【选择排序:O(n^2)】 基本思想: 在要排序的一组数中,选出最小的一个数与第一个位置的数交换,
* 然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止。
*/
public void selectSort(int[] arr) {
for (int i = 0; i < arr.length; i++) {//从第一个数开始遍历
int position = i;//最小值所处的坐标,for循环中会一直变
int temp = arr[i];//被遍历的节点存放在temp中,最开始默认为最小
for (int j = i + 1; j < arr.length; j++) {//遍历‘被遍历点’之后的数组
if (arr[j] < temp) {//如果节点小于被遍历的节点,更新temp最小值并记录该值所在的j地址;完后继续遍历看还有没有更小的
temp = arr[j];
position = j;
}
}
//此时temp为最小的
arr[position] = arr[i];
arr[i] = temp;
}
}
}