快速排序 百度面试题想到的
百度两道面试题:
百度面试题(一):假设一整型数组存在若干正数和负数,现在通过某种算法使得该数组的所有负数在正数的左边,且保证负数和正数间元素相对位置不变。时空复杂度要求分别为: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++;
}