您的位置:首页 > 编程语言 > C语言/C++

C语言中的排序、二分查找

2014-03-18 09:11 330 查看
下午要去华为参加面试了,听说很头疼啊,复习下基本的排序

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: