1.直接插入排序
直接插入排序类似于打扑克牌时拿到一张牌,将这张牌插入到手里已经排好序的牌中。
即每次选择无序区间的第一个元素,在有序区间内选择合适的位置插入。
例如一个无序数组
10 6 3 1 8
数组下标: 0 1 2 3 4
对这组数据进行排序,我们从无序区间中取一个元素即就是从下标1开始,记为 i,需要与有序区间比较,即取下标为0,记为 j,定义了两个循环,每次i++;j–;每次 i 值确定后设置一个tmp变量来存放 i 的值,比较array[ i ] 和array[ j ] 的大小,即对array[ j ]和 tmp 比较大小。
伪代码:
if(array[ j ] > tmp){
array[ j+1 ] = array[ j ];
}else{
array[ j+1 ]+1 = tmp;//将tmp放入原位置;
break;
}
此时注意:要考虑到当j < 0 时,要退出循环,此时代码:array[ j+1 ]+1 = tmp不能放在j的循环中,修改代码为
for (int i = 1; i <array.length ; i++) {
int tmp = array[i];
int j =i-1;
for (; j >=0 ; j--) {
if (array[j]>tmp){
array[j+1] =array[j];
}else {
break;
}
}
array[j+1]=tmp;
}
完整代码及代码测试:
import java.util.Arrays;
/**
* Created with IntelliJ IDEA.
* Description:
* User: HuYu
* Date: 2021-06-24
* Time: 19:30
*/
public class InsertSort {
public static void insertsort(int[] array){
for (int i = 1; i <array.length ; i++) {
int tmp = array[i];
int j =i-1;
for (; j >=0 ; j--) {
if (array[j]>tmp){
array[j+1] =array[j];
}else {
break;
}
}
array[j+1]=tmp;
}
}
public static void main(String[] args) {
int[] array = {1,123,56,8,99,13};
System.out.println(Arrays.toString(array));
insertsort(array);
System.out.println(Arrays.toString(array));
}
}
运行结果:
性能分析:
空间复杂度:0(1)
时间复杂度:最坏情况下 0(n^2) 最好情况下可以达到 *0(n)*即有序时。
稳定性:稳定的
if (array[j]>tmp)这里不取等号时即为有序的。
2.选择排序
每次从无序区间选出比有序区间最后一个元素小的元素,存放在有序区间的最后,直到每一次无序区间循环完,直到全部待排序的数据元素排完 。
定义两个循环,每次直到 j 循环完,选出 j 循环中比 i 中小的进行交换。
代码:
import java.util.Arrays;
/**
* Created with IntelliJ IDEA.
* Description:
* User: HuYu
* Date: 2021-06-26
* Time: 17:23
*/
public class SelectSort {
public static void main(String[] args) {
int[] array = {1, 123, 56, 8, 99, 13, 567, 23, 4, 76};
System.out.println(Arrays.toString(array));
selectSort(array);
System.out.println(Arrays.toString(array));
}
public static void selectSort(int[] array) {
for (int i = 0; i < array.length; i++) {
for (int j = i + 1; j < array.length; j++) {
if (array[i] > array[j]) {
int tmp = array[i];
array[i] = array[j];
array[j] = tmp;
}
}
}
}
}
运行结果:
性能分析:
空间复杂度:0(1)
时间复杂度:最坏情况下 0(n^2) 最好情况下可以达到 *0(n)*即有序时。
稳定性:稳定的