温故而知新,先复习一下这三个基础的排序法,以后再慢慢写详细的
冒泡排序
public static void bubblesort(int[] arr){/遍历整个数据,每遍历一次数组,就通过从0开始比较左右两个邻居元素,最大的往后移动,直至移动到数据最后。
int n = arr.length;
if (n<1) return;
for (int i=0; i<n; ++i){ //从下坐标0开始遍历整个数组,获得遍历次数
Boolean flag = false; //建立标志,当发生数据交换时候,为true,没有发生数据交换为false,当没有打算数据交换的时候(已经排好序了),可以直接结束
for (int j=0; j<n-1-i; ++j){ //开始遍历比较左右两个邻居元素,因为每一次遍历后就把最大值放在最后,每遍历一次就放一个,遍历后的最后元素是已经拍好顺序的了,不需要遍历,所以是n-1-i
if (arr[j]>arr[j+1]){ //左右邻居元素比较 ,两两比较,大值交换最后,通过遍历把最大值仍到最后
int tmp = arr[j]; //用临时变量存放值,交换
arr[j] = arr[j+1];
arr[j+1] = tmp;
flag = true; //因为发生了数据交换,flag变true
}
}
if (flag == flag){//如果没发生数据交换了,就证明已经是有序的了,直接退出遍历
break;
}
}
}
插入排序
public static void insertionsort(int[] arr){
int n = arr.length;
if (n<1) return; //判断如果只有一个元素,
for (int i=1; i<n;++i){ //从1为边界开始,左边是排序好的数组,右边是未排序的数据
int tmp= arr[i]; //获取未排序的数组中一个存储在tmp临时对象。
int j = i-1; //获取排序好的数组中的最后一位
for (;j>=0;--j){ //从最后一位遍历排序好的数组
if (arr[j]>tmp){ //判断临时对象跟排序数组中的最后一位对比,如果比排序好的数组中的值小,排序好的数组好就往后退一位,
arr[j+1] = arr[j]; //往后退位
}else {break;} //找到合适位置了,不大不小,退出去
}
arr[j+1] = tmp; //把这个临时对象插入到合适的位置(j在上面的break前又做了一遍--用来判断break,所以这时候加回去)
}
}
选择排序
public static void selectionsort(int[] arr){
int n =arr.length;
if (n<1) return;
for (int i=0;i<n;++i){ //遍历整个数组
int minindex = i; //设定第一个元素为最小下标
for (int j=i; j<n; ++j){ // i作为边界,左边是排序好的数组,右边是未排序好的数组,遍历右边
if (arr[j]<arr[minindex]){ //如果在右边发现比最后一个值小,就把右边这个元素下边赋予mindex标记
minindex = j;
}
}
int tmp = arr[i]; //让左边最后一个值跟右边minindex标记的元素互换。
arr[i] = arr[minindex];
arr[minindex] = tmp;
}
}