冒泡排序
public class BubblingSort {
public static void main(String[] args) {
int[] a = {3, 2, 6, 1, 5, 4, 7};
//最开始默认数组都是未排序的
bubble(a, 0, a.length - 1);
System.out.println(Arrays.toString(a));
}
//low 与 high 为未排序范围
public static void bubble(int[] a,int low,int high){
//递归结束条件就是未排序范围为1时
if(low == high){
return;
}
int j = low;
//只用排序未排序部分
for (int i = low; i < high; i++) {
//如果i+1索引比i索引小就交换两个值
if(a[i] > a[i+1]){
int temp = a[i];
a[i] = a[i+1];
a[i+1] = temp;
//记录最后一次交换后的i位置就是为下一次未排序的最大范围
j = i;
}
}
//递归,low不变,还是0
bubble(a,low,j);
}
/*j 表示的是未排序的边界,下一次递归时的 high
发生交换,意味着有无序情况
最后一次交换(以后没有无序)时,左侧 i 仍是无序,右侧 i+1 已然有序*/
}
插入排序
public class Main {
public static void main(String[] args) {
int[] a = {3, 2, 6, 1, 5, 4, 7};
//一开始将0索引的值为已经排序好的,所以从1索引开始插入
insertSort(a,1);
System.out.println(Arrays.toString(a));
}
//low为未排序的初始索引
public static void insertSort(int[] a, int low){
if(low == a.length){
return;
}
//记录初始索引位置的元素值
int t = a[low];
//low-1之前索引都是排序好的
//获取已排序索引的最后一个元素为后续跟未排序第一个元素作比较
int i = low -1;
//不断循环,直到找到比未排序第一个索引小的元素跳出循环
//有一种特殊情况是t比前面的数都小,不断循环i最终会变为-1
//所以需要加个条件,如果i<0也跳出循环
while (i >= 0 && a[i] > t){
a[i+1] = a[i];
i--;
}
//循环结束就找到了插入位置
//将初始索引位置的元素值赋值给比t小的下一个索引
//a[i+1] = t;
//此赋值有一个小优化的点就是未排序的元素值t刚好比该元素前一个已排序的值小
//不会进入循环,i的值也不会变化
//此时就不需要赋值a[i+1] = t了,可以继续递归了
if(i + 1 != low){
a[i+1] = t;
}
//继续排序low的下一个元素
insertSort(a,low+1);
}
}