下午要去华为参加面试了,听说很头疼啊,复习下基本的排序
#include <stdlib.h>
#include <stdio.h>
#include <sstream>
#include <algorithm>
#include <vector>
#include <iostream>
#include <iterator>
using namespace std;
static void swap(int * const var1, int * const var2)
{
int tmp_val = *var1;
*var1 = *var2;
*var2 = tmp_val;
}
static void quick_sort(int * const arr, const int low, const int high)
{
int p = -1, q = 0, i = low, key = arr[high];
if(high <= low)
return ;
for(i = low; i < high; i++)
if(arr[i] < key)
{
p++;
swap(arr + p, arr + i);
}
swap(arr + high, arr + p + 1);
quick_sort(arr, low, p);
quick_sort(arr, p + 2, high);
}
static void bubble_sort(int * const arr, const int arr_size)
{
int i = 0;
int j = 0;
int tmp_val = 0;
int max_val = 0;
for(i = arr_size - 1; i >= 0; i--)
{
for(j = 1; j <= i; j++)
{
if(arr[j] < arr[j-1])
swap(arr + j, arr + j - 1);
}
}
}
static void insert_sort(int * const arr, int arr_size)
{
int i = 0, j = 0;
int key = 0;
for(i = 1; i < arr_size; i++)
{
key = arr[i];
for(j = i; (j >= 1) && (arr[j - 1] < key); j--)
arr[j] = arr[j - 1];
arr[j] = key;
}
}
static void merge_sort(int * const arr, int low, int high)
{
int mid = low + (high - low) / 2;
int l = low, r = mid + 1;
const int lmax = mid, rmax = high;
std::vector<int> tmp_vec;
if(high <= low)
return;
merge_sort(arr, low, mid);
merge_sort(arr, mid + 1, high);
for(; l <= lmax && r <= rmax;)
{
if(arr[l] > arr[r])
tmp_vec.push_back(arr[l++]);
else
tmp_vec.push_back(arr[r++]);
}
for( ; l <= lmax; )
tmp_vec.push_back(arr[l++]);
for( ; r <= rmax; )
tmp_vec.push_back(arr[r++]);
copy(tmp_vec.begin(), tmp_vec.end(), arr + low);
}
static int binary_search(const int * const arr, int low, int high, int key)
{
int mid = low + (high - low) / 2;
if(low > high)
return -1;
if(arr[mid] == key)
return mid;
if(arr[mid] > key)
return binary_search(arr, mid + 1, high, key);
else
return binary_search(arr, low, mid - 1, key);
}
int main()
{
int arr[] = {1000, 100, 2000,230,90,10,100};
merge_sort(arr, 0, sizeof(arr)/sizeof(int) - 1);
copy(arr, arr + sizeof(arr)/sizeof(int), ostream_iterator<int>(cout, " "));
cout << endl;
cout << binary_search(arr, 0, sizeof(arr)/sizeof(int) - 1, 10) << endl;
cout << endl;
}