目录
Insert Sort 插入排序
将当前数插入到有序序列中。
遍历每个数,通过从后往前两两交换的方式插入到该位置之前的有序序列中。
伪代码实现
for(int i=1;i<array.length;i++)//遍历数组中每个数
for(int j=i;j>0;j--)//从后往前遍历有序序列两两交换直到正确位置
if(array[j]<array[j-1])
交换array[j]和array[j-1]的值;
else break;//已插入正确位置,退出内循环,对下一个数进行操作
复杂度分析
时间复杂度:O(n^2)
最佳情况:初始序列为正序,比较n-1次,交换0次,时间复杂度O(n)
最差情况:初始序列为倒序,比较1+2+3+...+n-1=n*(n-1)/2次,每次比较均要交换,时间复杂度O(n^2)
平均情况:外层循环次数固定,主要看内循环。而内循环次数就是当前有序序列中比array[i]大的元素数量。可以认为平均情况下内循环次数为倒序时的一半,故仍为O(n^2)
空间复杂度:1
Java代码
import java.util.Arrays;
public class TestClass {
static int[] array= new int[]{5, 6, 3, 4, 9, 2, 7, 0, 1, 8};
static void InsertSort(int[] array){
for(int i=1;i<array.length;i++)
for (int j = i; j > 0; j--)
if(array[j]<array[j-1]){
int tmp=array[j-1];
array[j-1]=array[j];
array[j]=tmp;
}
}
public static void main(String[] args){
InsertSort(array);
System.out.println(Arrays.toString(array));
}
}
Bubble Sort 冒泡排序
每次将无序部分的最小值推到数组前。
通过从后往前两两交换的方式将无序序列中的数按顺序堆成有序序列。
(也可以从前往后,这个学C语言写过太多懒得再写java版了)
伪代码实现
for(int i=0;i<array.length-1;i++)//遍历length-1次
for(int j=array.length-1;j>0;j--)//从后往前遍历当前长度为array.length的无序序列两两交换
if(array[j]<array[j-1])
交换array[j]和array[j-1]的值;
优化方案
使用flag标记,若“无序序列”已经有序,即,某次内循环没有发生交换,则不再外循环。
复杂度分析
时间复杂度:O(n^2)
空间复杂度:1
Selection Sort 选择排序
每次选择第i小的值放到第i个位置。
遍历无序序列找到第i小的值,将其与第i个数交换。
伪代码实现
for(int i=0;i<array.length-1;i++){//遍历length-1次
int index=i;//最小值当前位置
for(int j=i+1;j<array.length;j++){//遍历当前长度为array.length的无序序列找到最小值位置
if(array[j]<array[i])
index=j;
}
交换array[i]和array[index]的值;
}
复杂度分析
时间复杂度:O(n^2)
空间复杂度:1
Java代码
import java.util.Arrays;
public class TestClass {
static int[] array= new int[]{5, 6, 3, 4, 9, 2, 7, 0, 1, 8};
static void SelectionSort(int[] array){
for(int i=0;i<array.length-1;i++) {
int index=i;
for (int j = i + 1; j < array.length; j++)
if(array[j]<array[index])
index=j;
int tmp=array[i];
array[i]=array[index];
array[index]=tmp;
}
}
public static void main(String[] args){
SelectionSort(array);
System.out.println(Arrays.toString(array));
}
}