五.快速排序
快速排序是对冒泡排序算法的改进,核心思想就是通过一趟排序把待排序序列分成两部分,一部分比关键字(枢轴)大,一部分比关键字小,重复以上过程,直到排序完成
看看具体怎么做
int a[] ={49 ,38 ,65 ,97 ,76 ,13 ,27 ,49}
- 以待排序序列的第一个元素49为关键字 第一趟:27 38 13 49 76 97 65 49
- 以待排序序列的第一个元素27 76为关键字第二趟:13 27 38 49 49 65 76 97
稍微详细一点的思路
第一趟排序
定义两个指针,一个叫low ,一个叫high
low high
49 38 65 97 76 13 27 49 选择关键字49,<一般选择待排序序列第一个元素为关键字>
a[high]=97>49 high-=1 a[high]=76>49
high-=1 a[high]=49 并且 low==high
我们发现,此时序列已经被分成两个部分,一边比49小,一边比49大。
至此,第一趟排序已经完成
第二趟排序与第一趟排序步骤相同,这里不再重复
下面看看代码实现
int partition(ElementType a[],int low,int high)
{
int key = a[low];//关键字
while(low<high){
while(low<high && a[high]>=key) --high;//在序列中找一个比关键字小的数
a[low] = a[high];
while(low<high && a[low]<=key) low++;//在序列中找一个比关键字大的数
a[high] = a[low];
if(low>=high) break;
}
a[low] = key;//插入关键字
return low;
}
void qSort(ElementType a[],int s,int r)//快速排序
{
if(s<r){//若低位小于高位
int q = partition(a,s,r);//将待排序序列分成两个序列,得到关键字的位置
qSort(a,s,q);//对关键字左边的序列排序
qSort(a,q+1,r);//对关键字右边的序列排序
}
}
分析
快速排序的平均时间为knln(n) ,并且快速排序目前被认为是最好的一种内部排序方法
时间复杂度为O(n*ln(n))
T(N) = T(N)如果初始序列为基本有序时,快速排序将退化为冒泡排序,时间复杂度为O(N^2)