排序算法系列第三篇,快速排序,快速排序是最常用的排序算法之一,采用了递归迭代的思想,能大大提高排序效率。
平均时间复杂度 | 最好情况 | 最坏情况 | 空间复杂度 | 稳定性 | 排序方式 | |
快速排序 | O(nlogn) | O(nlogn) | O(n2) | O(nlogn) | 不稳定 | In-Place |
基本思想:首先对无序的记录序列进行“一次划分”,通过一趟排序将待排序列分为两部分,使得其中一部分记录的关键字均比另一部分小,再分别对这两部分排序,以达到整个序列有序。
一句话概括就是,“分而治之”!
其实,有点诸侯国那味儿,天子作为原始代排列数组,将原始内容按照中心轴为基准,分配给诸侯,各个诸侯只要排好序,那整体就有序了,同样诸侯再往下分,最后到平民,最苦的还是基层老百姓,统治阶级大手一挥坐享其成就完事了
代码,以R为例
quicksort <- function(array,start,end){
left=start
right=end
if(left>=right){
return(array)
}
else{
#一般选取第一个元素为中心轴元素
markvalue=array[left]
while(left<right){
while(left<right&&array[right]>markvalue){
right=right-1
}
array[left]=array[right]
while (left<right&&array[left]<=markvalue) {
left=left+1
}
array[right]=array[left]
}
print(array)
}
array[left]=markvalue
array=quicksort(array,start,left-1)
array=quicksort(array,right+1,end)
return(array)
}
代码示意图如下:
优化,单循环
选定基准元素,同时设置一个mark指针指向数列起始位置
从基准元素的下一位开始遍历
如果遍历到的元素大于基准,继续向后
如果遍历到的元素小于基准,指针右移1位,遍历元素和指针元素互换
重复上述操作
递归子序列
代码,以R为例
single_quickSort=function(array){
n=length(array)
mark=array[1]
exchange=1,record=2
for(i in 1:n){
if(array[i]>mark){
exchange=i
record=i+1
break
}
}
if(exchange!=1&&exchange!=n){
for(i in record:n){
if(array[i]<=mark){
temp=array[i]
array[i]=array[exchange]
array[exchange]=temp
exchange++
}
}
array[i]=array[exchange-1]
array[exchange-1]=mark
}
if(exchange==1){
array[1]=array[i]
array[i]=mark
}
if((exchange-2)>=2){
array[1:(exchange-2)=single_quickSort(array[1:(exchange-2}])
}
if((n-exchange+1)>=2){
array[exchange:n]=single_quickSort(array[exchange:n])
}
return(array)
}
优化后代码示意图如下: