1.插入排序
直接插入
二分法插入
希尔插入
2.选择排序
3.交换排序
冒泡排序
快速排序
4.归并排序
5.基数排序
插入排序
直接插入排序 空间复杂度大,时间复杂度 n^2/2 n平方除以2
插入排序是一种递归思想,由N-1趟排序组成。
初始时,只考虑数组下标0,只有一个元素,默认是有序的。
然后第一趟 对下标为1的元素进行排序,保证数组[0,1]上的元素有序;
第二趟 对下标2处的元素进行排序,保证数组[0,2]上的元素有序;
...
...
第N-1趟对下标N-1处元素进行排序,保证数组[0,N-1]上的元素有序,
它的递归思想体现在:当对位置i处的元素进行排序时,[0,i-1]上的元素一定是有序的了。
public static <T extends Comparable<? super T>> void insertSort(T[] a){ for(int p = 1; p < a.length; p++) { T tmp = a[p];//保存当前位置p的元素,其中[0,p-1]已经有序 int j; for(j = p; j > 0 && tmp.compareTo(a[j-1]) < 0; j--) { a[j] = a[j-1];//后移一位 } a[j] = tmp;//插入到合适的位置 } }
二分法插入排序(插入到已排好序的数组中)
对left,right赋值与中间一位数比较,
对left,right重新赋值,再与中间值比较
....
直到值一样,或者right-1 = left
把值插入到left的右边
希尔排序(留坑,后面补充)
选择排序 时间复杂度 : (n+1)n/2
经过N-1趟直接选择排序得到有序结果:
第一趟选择数组中最小的数字,与第一位交换位置,得到1个长度新的有序区域和长度-1的新无序区
第二趟选择无序数组中最小的数组,与第二位交换位置,得到2个长度的有序区域和长度-2的新无序区
...
...
第N-1趟后
得到N个长度的有序区域
归并排序比较占用内存,但却是一种高效且稳定的算法。
归并操作(merge):将两个顺序序列合并成一个顺序序列。
交换排序
冒泡排序: 时间复杂度: n^2 n平方
双层for循环
比较相邻的元素,如果第一个比第二个大,就交换他们两个。
对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。
针对所有的元素重复以上步骤,除了最后一个。
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较
快速排序:
冒泡排序的优化
选择数组首个元素为基数,
比基数大的数字放到基数的后面,比基数小的放到基数前面,使用递归方法不断分割数组。
以此达到整个数据变成有序序列。
基数排序
按照数组中的元素的个位数放到【0,9】的桶子里
个位数是0 放到桶子0里面
个位数是1 放到桶子1里面
...
放完了以后,根据桶子从0-9重新排好序
按照数组中的元素的十位数放到【0,9】的桶子里
十位数是0 放到桶子0里面
十位数是1放到桶子1里面
...
放完了以后,根据桶子从0-9重新排好序。
由最大数字的位数来确定就几轮操作
位数大的使用MSD(最高位优先Most Significant Digit first)方法排序,
位数小的使用LSD (最低位优先Last Significant Digit first)方法排序