个人学习所用,写出来理清自己的思路,也为大家提供帮助,如有谬误,欢迎指出。
冒泡排序
问题:为什么最佳情况的时间复杂度为O(n)?
笔记:很多基础代码样例的代码正常来算应该都是O(n²)。比较符合情况的答案是对代码添加标志位,来判断当前循环是否已经达到正/倒序,是则结束排序,此时最优情况也就是有序数组一次遍历完成后跳出,时间O(n)。
快速排序-两种实现
算法导论版-交换两种元素
具体描述在书上就不赘述了,这里贴一段伪代码翻译过来的C++代码,方便大家阅读。注意排序时初始调用的是QuickSort(数组名,起始位置,终止位置)。
int Partition(int A[],int p,int r){
int x=A[r];
int i=p-1;
for(int j=p;j<r;j++){
if(A[j]<=x){
i=i+1;
swap(A[i],A[j]);
}
}
swap(A[i+1],A[r]);
return i+1;
}
void QuickSort(int A[],int p,int r){
if(p<r){
int q=Partition(A,p,r);
QuickSort(A,p,q-1);
QuickSort(A,q+1,r);
}
}
严蔚敏版-填坑式
《数据结构》伪代码易于阅读,描述清楚,就不再贴了。
填坑式核心思想是将基准数pivot在排序前取出(原地留一个坑,也就是空位置),左右指针交替扫描,遇到情况则取出数据(挖了新坑)并放在上一个坑中,直至左右指针相遇,将基准数放进这个坑里。