快速排序的核心思想,是根據基準值,將陣列分成兩部分,其中左邊部分全部小於基準值,右邊部分全部大於基準值,基準值一般取
陣列中間的數,也可以取多個數的平均值。之後,分別對左邊部分和右邊部分進行排序,左邊和右邊都排序好了,整個陣列也就排序好了。同樣地,左邊部分和右邊部分又可以繼續按這種思路對半排序。採取這種分而治之(分治法)的演算法,可以實現快速排序。以下是這種方法的非遞迴實現。
<?php
/***
*@param array
**@return array
*@author ldy
*/function
quick_sort
($arr
)// 這裡將分組資訊儲存到stack棧
$stack
=['middle'
=>
$middle
,// 'leftarr' => $leftarr,
'rightarr'
=>
$rightarr,]
;if(count
($leftarr
)<2)
array_push
($sorted
,$parent
['middle'])
;//上一次分組的基準值比$sorted中的值都更大,但比未入併入$sorted的值都更小if(
count
($parent
['rightarr'])
<2)
else}}
else
}else
}while(!
empty
($arr))
;return
$sorted;}
$arr=[
20,2,
3,24,
19,14,
12,30]
;print_r
(quick_sort
($arr))
;
快速排序實現(遞迴 非遞迴)
首先是劃分演算法,假設每次都以第乙個元素作為樞軸值,進行一趟劃分 int partition int a,int low,int high a low pivot 將樞軸值元素置於最終位置 return low 第乙個while迴圈裡的 還可以採用如下形式 while low high a high...
快速排序非遞迴演算法
本人根據書上的三數中值快速排序修改 struct leftright inline void swap int a,int b void qsort int a,int left,int right for int m 1 0 k ma center swap a left a center if ...
快速排序 非遞迴演算法
include stdafx.h include using namespace std int myarray void printarray int array,int len printf r n int partition int s,int l,int r 從左向右找大於或等於x的數來填s...