百度两道面试题:
百度面试题(一):假设一整型数组存在若干正数和负数,现在通过某种算法使得该数组的所有负数在正数的左边,且保证负数和正数间元素相对位置不变。时空复杂度要求分别为:o(n)和o(1)。
百度面试题(二),给定一个存放正数的数组,重新排列数组使得数组左边为奇数,右边为偶数,且保证奇数和偶数之间元素相对位置不变。时空复杂度要求分别为:o(n)和o(1)。
这两个题目实际上是快速排序partion过程。快排的C++代码如下:
#include <iostream>
using namespace std;
int num;
void swap(int &a, int &b)
{
int temp = a;
a = b;
b = temp;
}
void PrintArray(int *arr)
{
for(int i=1; i<=num; ++i)
cout << arr[i] << " ";
cout << endl;
}
int Partition2(int *arr, int beg, int end)
{
int sentinel = arr[end];
int i = beg-1;
for(int j=beg; j<=end-1; ++j)
{
if(arr[j] <= sentinel)
{
i++;
swap(arr[i], arr[j]);
}
}
swap(arr[i+1], arr[end]);
cout << "ÅÅÐò¹ý³Ì:";
PrintArray(arr);
return i+1;
}
void QuickSort(int *arr, int beg, int end)
{
if(beg < end)
{
int pivot = Partition2(arr, beg, end);
QuickSort(arr, beg, pivot-1);
QuickSort(arr, pivot+1, end);
}
}
int main()
{
int arr[100];
cout << "Input the num of the elements:\n";
cin >> num;
cout << "Input the elements:\n";
for(int i=1; i<=num; ++i)
cin >> arr[i];
QuickSort(arr, 1, num);
cout << "×îºó½á¹û:";
PrintArray(arr);
return 0;
}
将partion部分的枢纽设计为0,第一个题目就可以解决。
pre = 0;
cur = 1;
while
(cur < length(array))
{
if
(array[cur] < 0)
{
swap(array[cur],array[pre]);
pre ++;
}
cur++;
}