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

下午要去華爲參加面試了,聽說很頭疼啊,複習下基本的排序


#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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章