若将快速排序的一次划分改写为如下形式,重写快速排序的算法,并讨论对长度为N的记录序列进行快速排序时在最好的情况下所需进行的关键字间比较的次数(包括三者求中)。
int partition(SqList &L, int low, int high, bool ci, bool cj) { int i, j, m; KeyType x; i = s; j = t; m = (s+t)%2; x = Midkey(s, m, t); //三者取中值 ci = cj = FALSE; while (i<j) { while((i<j) && (r[i].key<=x)) { i = i + 1; if(r[i].key<r[i-1].key) r[i]↔r[i-1]; ci = TRUE; }//while while((j>i) && (r[j].key>x)) { j = j - 1; if(r[j].key>r[j+1].key) { r[j]↔r[j+1]; cj = TRUE; }//if if(i<j) { r[i]↔r[j]; if((i>s) && (r[i].key<r[i-1].key)) ci = TRUE; if((j<t) && (r[j].key>r[j+l].key)) cj = TRUE; }//if }//while }//while return i; }//partition