目录
说明
为了自己学习方便,我这里总结了四大排序算法涵盖了七种排序算法
分类 | 算法名称 | 时间复杂度 空间复杂度 | 稳定性 |
插入排序 | 直接插入排序 希尔排序 | O(n^2) O(1) O(n^2/3) O(1) | 稳定 不稳定 |
选择排序 | 选择排序 堆排序 | O(n^2) O(1) O(nlogn) O(1) | 不稳定 不稳定 |
交换排序 | 冒泡排序 快速排序 | O(n^2) O(1) 全部有序最坏O(n^2) O(1) | 稳定 不稳定 |
归并排序 | 归并排序 | O(nlogn) O(n) | 稳定 |
直接插入排序
说到直接插入排序,你可以想象自己正在斗地主,保证自己手里的牌是有序的,每拿一张牌就把它插进去。
思路很简单,第一个数字看成有序的,然后++,再排序,直到整个数组都变成有序的,下面看代码
//直接插入排序
public static void insertSort(int[] arr){
if(arr.length==0 || arr.length==1){
return;
}
int j;
for(int i=1;i<arr.length;i++){
//判断是否小于前一个元素,如果小于需要找到正确的位置插入
if(arr[i]<arr[i-1]){
//临时变量保存arr[i]
int temp=arr[i];
for(j=i-1;j>=0 && arr[j]>temp;j--){
//大于temp的元素后移
arr[j+1]=arr[j];
}
//找到位置后插入
arr[j+1]=temp;
}
}
}
希尔排序
希尔排序也叫缩小增量排序,先给定一个增量(我这里选择的是gep=gep/3+1),加一是为了保证最后的增量为1,当增量为1的时候也就意味着排好序了。下面看代码
public static void SellSort(int[] arr){
if(arr.length==0 || arr.length==1){
return;
}
//先让增量为数组的长度
int gep=arr.length;
//增量为1的时候代表排好序了
while (gep>1){
gep=gep/3+1;
for (int i = 0; i < arr.length-gep; i++) {
//让每组有序
if(arr[i]>arr[i+gep]){
//交换函数,可以自己补充
swap(i,i+gep,arr);
}
}
}
}