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; }
相关文章推荐
- C语言:编写查找和排序函数(二分查找,冒泡排序,选择排序法,插入排序)
- c语言 快速排序 和 二分 查找 模型
- C语言排序(5)___青蛙过河——(二分查找)
- C语言实现直接插入排序,冒泡排序以及二分查找(巩固理解记忆)
- C语言快速排序与二分查找算法示例
- C语言排序(6)___送数字——(二分查找)
- C语言 数据结构之排序与查找 数据结构实验之查找四:二分查找
- C语言实现直接插入排序,冒泡排序以及二分查找(巩固理解记忆)
- C语言排序(二)——二分查找
- NYOJ.904 search(二分查找,快速排序,结构体运用)
- C语言:顺序,二分查找,冒泡排序实践项目
- C语言实现二分查找
- 数组排序、求最值、二分查找
- C语言 数据结构排序与查找 数据结构实验之排序二:交换排序
- 百炼2774-木材加工-C语言-二分查找
- 经典算法-选择排序,冒泡排序,二分查找
- 冒泡排序 二分查找 快速排序 线性查找
- c语言实现二分查找变种题型
- lintcode- 题106 排序链表转换为二分查找树
- Java选择排序、冒泡排序、直接插入排序与二分查找