问答题 试设计一算法,使得在尽可能少的时间内重排数组,将所有取负值的关键字放在所有取非负值的关键字之前,并分析算法的时间复杂度。
【正确答案】
【答案解析】采用类似于快速排序中的划分思想。算法如下:
void part(KeyType A[], int n){
int i-1; j=n;
KeyType temp;
while(i<j){
while(i<j && A[j]>=0) j--; //从右向左找负数
while(i<j && A[i]<0) i++; //从左向右找非负数
if(i<j){ //交换元素A[i]和A[j]
temp=A[i]; A[i]=A[j]; A[j]=temp;
i++; j--;
}
}
}
该算法的时间复杂度为O(n)。