事后分析:
使用currentTimeMillis测试时间
计算重点关心:核心操作次数和输入规模
次数T(n) = 执行时间O(f(n))
大O阶,线性阶
对数阶
空间复杂度
comparable 接口
用减法实现 重写CompareTO方法,定义规则
冒泡、选择和插入排序
冒泡排序O(n的平方)
1、泡往后冒
for(int i = length - 1 ; i > 0; i--){ ![请添加图片描述](https://img-blog.csdnimg.cn/d809f872f164488897c5ca3eadf52a13.jpeg)
for(int j = 0 ; j < i ; j++){
if(a[i] < a[j])//重写compare比较
ex(i,j);
}
exchange(a[index],a[j]);
}
选择排序 O(n的平方)
选择最小元素放最前面当标志位
1、最后一个不用遍历 length - 1
2、定义缓存,存第一次遍历的位置
3、从下一个开始比
for(int i = 0 ; i < length - 1 ; i++){
int minindex = i;
for(int j = i + 1 ; j < length ; i++){
if(a[j] < a[index])//重写compare比较
minindex = j;
}
exchange(a[index],a[j]);
}
插入排序 O(n的平方)
分为已排和未排
1、从第2个开始比较
2、从当前这个开始往前比较
for(int i = 1; i <length ; i++){
for(int j = i ; j>0;j--){
//比较 j和j-1
if(j < j-1){
exchange
}else break;
}
}
高级排序算法
排序稳定性依据,相同的值在排序时是否会交换位置
希尔排序(N乘以log以2为底的N次幂)
从大到小要设计出口 小到大有时可忽略 因有length的因素
增量规则 h/2
1、选定增量h,按h作为分组依据
2、对分好的每一组完成插入排序
3、减少增长量,最小减少为1,重复2操作
初始规则
int h = 1;
while(h<长度/2){
h = 2h + 1;
}
减少 h=h/2
1)根据数组a的长度,确定增量初始
2)希尔排序
for( int i = h ; i < a.length ; i++){
for(int j = i ; j >= h ; j-=h){
//待插入的是a[j],比较a[j-h]
if(比较){
exchange(a[j],a[j-h]);
}else{
//待插入元素已找到合适的位置
break;
}
}
二分归并(N乘以log以2为底的N次幂)
合并时归并排序(比较两组指针指向的插入辅助指针)
快排 O(N乘以log以2为底的N次幂)
拆分前排序