应用题 7.试设计一算法,使得在尽可能少的时间内重排数组,将所有取负值的关键字放在所有取非负值的关键字之前,并分析算法的时间复杂度。
【正确答案】采用类似于快速排序中的划分思想。算法如下:
void part(KeyType A[],int n){
int i=1;j=13;
KeyType temp;
while(i<j){
while(i<j&&A Ej]>=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)。
【答案解析】