(本周学习的主要是《啊哈算法》中1~3章:排序、栈、队列、链表、枚举)
快速排序
平均时间复杂度O(NlogN)。
-
每次排序时设置一个基准值,将小于基准值的数放在左边,大于基准值的数放在右边。(基准值归位)。
-
每次排序后得到分割点(归位后的基准值),数据从分割点处分成两个部分。
-
从侧开始再次进行分割,待一侧彻底完成分割,再递归进行另一侧的分割。
例:对以下10个数进行排序
6 1 2 7 9 3 4 5 10 8
首先将设基准值为temp,temp=6。接下来将小于temp的值放在temp的左边,大于temp的值放在temp的右边。
3 1 2 5 4 6 9 7 10 8(第一次排序)
以上完成一次排序,也就是将基准值归位。下面是具体描述:
- 从右侧开始寻找小于temp的数a[j],然后从左侧开始寻找大于temp的数a[i]。两边成功找到,交换a[i]与a[j]。
- 若i<j,继续寻找、交换。直至i==j。
- 最后,交换temp与a[i]的值,成功将本次的基准值归位。
代码如下:
void quicksort(int left,int right){
int i,j,t,temp;
if(left >right)
return;
temp=a[left];
i=left;
j=right;
while(i!=j)
{
//从右开始往左找小于temp的值
while(a[j]>=temp&&i<j)
j--;
//再从左往右找大于temp的值
while(a[i]<=temp&&i<j)
i++;
if(i<J)//当i与j未相遇
{
int t=a[i];
a[i]=a[j];
a[j]=a[i];
}
}
//最后将基准值归位
a[left]=a[i];
a[i]=temp;
quicksort(left,i-1);//递归,继续处理左半部分
quicksort(i+1,right);//递归,继续处理右半部分
}
总结:
队列(先进先出 First In First Out)
- 队列是一种特殊的线性结构,它只允许再队首(head)进行删除操作即“出队”,而在队列尾部(tail)进行插入操作即“入队”。
- 当队列中没有元素时(head==tail)称该队列为空队列。
- 常用链表表示。
- 以下可以将三个基本元素封装为一个结构体类型,用来表示队列:
struct queue
{
int data[200];//队列主体
int head;//队首
int tail;//队尾
}
栈(后进先出 Last In First Out)
- 栈时具有一定操作约束的线性表,只能在一端进行插入和删除操作。
- 插入即入栈(push),删除即出栈(pop),栈顶(top)。
- 常用数组表示。
- 每入栈一次top随之+1,每出栈一次top随之-1。栈中没有元素时(top=0),称该堆栈为空栈。
枚举(穷举)
- 有序的尝试每一种可能。