C++实现快排代码
int Partition(int numbers[], int begin, int end)
{
int x = numbers[end];
int mid = begin - 1;
for(int j = begin; j < end; j++)
{
if(numbers[j] < x)
{
mid++;
if(j != mid)
{
int temp = numbers[mid];
numbers[mid] = numbers[j];
numbers[j] = temp;
}
}
}
numbers[end] = numbers[mid + 1];
numbers[mid + 1] = x;
return mid + 1;
}
void QuickSort(int numbers[], int begin, int end)
{
if(begin < end)
{
int mid = Partition(numbers, begin, end);
if(mid > begin)
QuickSort(numbers, begin, mid - 1);
if(mid < end)
QuickSort(numbers, mid + 1, end);
}
}
编程题
题目一(剑指offer29):
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
代码(时间nlogn 非最优):
class Solution {
public:
int MoreThanHalfNum_Solution(vector<int> numbers) {
int result = 0;
if(numbers.size() == 0)
return result;
QuickSort(numbers, 0, numbers.size() - 1);
int count = 0, current = numbers[0];
for(int i = 0; i < numbers.size(); i++)
{
if(numbers[i] == current)
{
count ++;
if(count * 2 > numbers.size())
return current;
}else{
count = 1;
current = numbers[i];
}
}
return result;
}
int Partition(vector<int> &numbers, int begin, int end)
{
int x = numbers[end];
int mid = begin - 1;
for(int j = begin; j < end; j++)
{
if(numbers[j] < x)
{
mid++;
if(j != mid)
{
int temp = numbers[mid];
numbers[mid] = numbers[j];
numbers[j] = temp;
}
}
}
numbers[end] = numbers[mid + 1];
numbers[mid + 1] = x;
return mid + 1;
}
void QuickSort(vector<int> &numbers, int begin, int end)
{
if(begin < end)
{
int mid = Partition(numbers, begin, end);
if(mid > begin)
QuickSort(numbers, begin, mid - 1);
if(mid < end)
QuickSort(numbers, mid + 1, end);
}
}
};
题目二(剑指 offer 30):
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
代码:
class Solution {
public:
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
//用partition的思想解
vector<int> result;
if(input.size() == 0 || k == 0 || input.size() < k)
return result;
int begin = 0, end = input.size() - 1;
int mid = Partition(input, begin, end);
while(mid != k - 1)
{
if(mid > k - 1)
{
end = mid - 1;
mid = Partition(input, begin, end);
}
else
{
begin = mid + 1;
mid = Partition(input, begin, end);
}
}
for(int i = 0; i < k; i++)
result.push_back(input[i]);
return result;
}
int Partition(vector<int> &input, int begin, int end){
int x = input[end];
int mid = begin - 1;
for(int i = begin; i < end; i++)
{
if(input[i] < x)
{
mid++;
if(i != mid)
{
int temp = input[i];
input[i] = input[mid];
input[mid] = temp;
}
}
}
mid++;
input[end] = input[mid];
input[mid] = x;
return mid;
}
};