其实算法的核心就是分而治之和减而治之 就是把问题的规模不断的减少和降低
==========================
这几天学习了一下冒泡排序算法,总结如下
1.最常见和效率最差的算法。
这个算法的核心就是拿每一个值都和没有排序的值进行比较,时间复杂度是O(n^2) 无论最好和最坏
void bubble0(int *a){
int i;
int j;
for(i=0; i<sizeof(a)/sizeof(a[0]); i++)
for(j=i+1;j<sizeof(a)/sizeof(a[0]);j++){
if(a[i]>a[j])
swap(&a[i],&a[j]);
}
}
2.场景,一部分排序好了,一部分没有
如果在排序的过程中发现后面的已经排序好了,这个时候是可以停止排序的。时间复杂度最好O(n^1.5),最坏O(n^2);
bool bubble(int *a,int lo ,int hi){
bool sorted = ture;//默认有序
while(++lo < hi){
if(a[lo-1]> a[lo]){
swap(&a[lo-1],&a[lo]);
sorted = false;//存在逆序,所以为FALSE;
}
}
return sorted;
}
//调用
while(!bubble(a,lo,hi--));
3.场景:只有前面一小部分没有排序,后面大部分排序好了。时间复杂度最好O(n),最坏O(n^2)
int bubble(int *a,int lo,int hi){
int last = lo;
while(++lo < hi){
if(a[lo-1] > a[lo]){
last = lo;
swap(&a[lo-1],&a[lo]);
}
}
return last;
}
//调用
while(lo <(hi= bubble(a,lo,hi));