前面介绍了直接插入排序和shell排序基本排序算法(1)—插入排序及其变形shell排序 ,直接插入排序的时间复杂度为平方级,shell排序的时间复杂度较好,为O(nlog2 n),但这并非排序算法中效率最高的,理论上基于比较的排序算法,时间复杂度最低可以达到O(nlog n),本文所分析的快速排序,在平均情况下可以达到O(nlog n)。
快速排序基于分治法,对给定的一个数组(a1,a2,a3.....an),以某一个数为界,比如说以a1为界,将小于a1的全部放在左边而大于a1的全部放在右边,
即成为(ai,aj...a1....ak),然后对两部分分别递归调用快速排序算法。
举例来说,对于(55,41,59,26,53,58,97,93),以55为界,将其划分为(41,26,53,55,59,58,97,93),然后分别对(41,26,53)和(59,58,97,93)进行快速排序。
显而易见,最重要的是划分过程,划分过程代码写出来,其他部分不过是简单的递归调用而已。
考虑上面的例子(55,41,59,26,53,58,97,93),以55为界,初始两个下标i=0(指向55),j=1,用j来遍历数组:
j=1,41<=55,则 i++(1,指向41) , 此时数组为(55,41,59,26,53,58,97,93), j++(继续遍历)
j=2,59>55,则 i不变(1,指向41), 此时数组为(55,41,59,26,53,58,97,93),j++
j=3,26<=55,i++(2,指向59),交换26和59,此时数组为(55,41,26,59,53,58,97,93),j++
j=4,53<=55,则i++(3,指向59),交换53,59此时数组为(55,41,26,53,59,58,97,93),j++
j=5,58>55,则i不变(3,指向53), 此时数组为(55,41,26,53,59,58,97,93),j++
这样一直遍历, 最后数组为(55,41,26,53,59,58,97,93),
此时i=3,指向53,最后只需交换55和53, 数组变为(53,41,26,55,59,58,97,93)
此时i=3,指向55,递归调用QuickSort(0,2)和QuickSort(4,7)即可
C++代码如下
void QuickSort(int *a,int startIndex,int endIndex)
{
if(startIndex>=endIndex)
return;
int i=startIndex,temp=0;
for(int j=startIndex+1;j<=endIndex;j++)
{
if(a[j]<=a[startIndex])
{
i++;
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
temp=a[i];
a[i]=a[startIndex];
a[startIndex]=temp;
QuickSort(a,startIndex,i-1);
QuickSort(a,i+1,endIndex);
}