6 4 3 7 5
用变量i记录,(i+1)代表着下一个比pivot大的元素,j对元素序列进行遍历(p<=j<=q-1),当其遍历的元素比pivot小,则交换A[i+1]与A[j]
始终保持i,i+1为序列中小元素,大元素的分界线...
遍历完成后交换A[q]与A[i+1],此时i+1即为A[q]元素的最终位置,
以此为界,形成的二个子序列进行递归,递归结束的条件是p<=q,即只有一个/零个元素的情况
核心代码:
int quickSort(float A[],int p,int q){
if(p<q)
{
float pivot = A[q];
int i = p-1;
int j;
for(j=p;j<q;j++)
{
if(A[j]<pivot) {SWAP(A[i+1],A[j]); i++;}
}
SWAP(A[i+1],A[q]);
quickSort(A,p,i);
quickSort(A,i+2,q);
}
}
编码过程中出现的二个问题:
(1)之前用int pivot而不是float pivot,结果在赋值int pivot=A[q]的时候,浮点数自动取整
(2)在quickSort的排序过程中,交换的发生双方可能是同一个元素(比如A[0]),这就导致程序中的SWAP交换宏不能正常使用,产生很多0元素