一个面试题
百度面试题,假设一整型数组存在若干正数和负数,现在通过某种算法使得该数组的所有负数在正数的左边,且保证负数件和正数间元素相对位置不变。时空复杂度要求分别为:o(n),o(1)
例如
-3 4 2 -1 7 3 -5
排序后
-3 -1 -5 4 2 7 3
[解决办法]
之前有个Sleep排序,不知能不能用上
[解决办法]
冒泡排序。。。
[解决办法]
//使用快速排序的思想。用0来进行partition。下面是我写的代码
#include <iostream>
using namespace std;
void exchange(int& a,int& b){
int temp;
temp = a;
a = b;
b = temp;
}
int partition(int *a,int p,int r){
int q;
int temp;
int i,j;
i=p-1;
for(j=p;j<=r;j++){
if(a[j] < 0){
i++;
exchange(a[i],a[j]);
}
}
return 1;
}
int main(){
int a[10] = {1,9,12,-1,7,6,-2,8,11,3};
for(int i=0;i<10;i++){
cout << a[i] << " ";
}
cout << endl;
partition(a,0,9);
for(int i=0;i<10;i++){
cout << a[i] << " ";
}
}
[解决办法]
整型数组换成链表处理就行了。
[解决办法]
等待答案
[解决办法]
中间的有个sleepa
[解决办法]
链表:
一个原链表,一个新链表,分别存储正、负数
在原链表中顺序查找,找到一个负数则摘除、链入新链表,直到原链表尾。
将原链表链到新链表后
--完毕
[解决办法]
直接顺序遍历。搞两个指针,一个负数一个正数。 满足,负数指针大于正数指针就交换,
应该就满足题目要求了。
[解决办法]
看不到我的回复吗?那我再发一遍好了。就是使用快速排序的思想。用0作为partition的条件。步骤为:
从头开始遍历,然后发现某一个数比0小,就把它换到前面。当然前面也有一个记录边界位置的变量。代码如下:
#include <iostream>
using namespace std;
void exchange(int& a,int& b){
int temp;
temp = a;
a = b;
b = temp;
}
int partition(int *a,int p,int r){
int q;
int temp;
int i,j;
i=p-1;
for(j=p;j<=r;j++){
if(a[j] < 0){
i++;
exchange(a[i],a[j]);
}
}
return 1;
}
int main(){
int a[10] = {1,9,12,-1,7,6,-2,8,11,3};
for(int i=0;i<10;i++){
cout << a[i] << " ";
}
cout << endl;
partition(a,0,9);
for(int i=0;i<10;i++){
cout << a[i] << " ";
}
}
[解决办法]
void my_func(int src[], int size) { int *table = new int [size]; int i, j; int *p; for (p = table, i= 0; i < size; ++i) { if (src[i] < 0) { *p++ = src[i]; } } for (p = table + size, j = size - 1; j >= 0; --j) { if (src[j] >= 0) { *--p = src[j]; } } for (i = 0; i < size; ++i) { src[i] = table[i]; } delete[] table; }
[解决办法]