一、快速排序总结:
给快速排序做个总结是看到之前上数据结构的时候给老师写的一个关于考试程序纠错的邮件。错误的程序如下:
void QuickSort(RecType R[],int s,int t)
{
int i=s,j=t;
RecType tmp;
if (s<t)
{
tmp=R[s];
while (i!=j)
{
while (j>i && R[j].key>tmp.key) //在该处若初始序列首尾值相等,将陷入死循环
j--; //一种修改方法是 R[j].key>=tmp.key
R[i]=R[j]; //另一种是在R[i]=R[j]后加i++语句(后面是j--)
while (i<j && R[i].key<tmp.key)
i++;
R[j]=R[i];
}
R[i]=tmp;
QuickSort(R,s,i-1);
QuickSort(R,i+1,t);
}
}
之前写快速排序都是喜欢上面那样写一个函数,快排的经典思想就是分而治之。对一个数组,先选一个pivotkey(枢轴中心),一般情况下就直接选数组的第一个元素。然后对数组从后向前遍历,将小于pivotkey的元素放在数组左边;又对数组从前向后遍历,将大于pivotkey的元素放在数组的右边;如此反复之后前后遍历的伪指针相等,这时候也就是pivotkey值应在的位置:左半部分全小于pivotkey,右半部分全大于pivotkey。 接下来分而治之,采用递归在将左半部分和右半部分分别再做上述操作。时间复杂度最好的情况下(每次枢轴放在数组正中间)是O(n*logn)。 最坏的情况(数组本身已经有序顺序或者逆序)是O(n^2)。 快速排序复杂度分析
上面的写法将数组partition和算法递归的过程写在了一起。两个过程分开写的