面试常见5个算法套装,4个排序+二分查找
2014-09-12 14:53
155 查看
面试常见的要你手写的算法,今天复习了一下,表示heapsort没法一次写对。
#include "stdio.h" #include "stdlib.h" #define LEFT(i) (2 * i + 1) #define RIGHT(i) (2 * i + 2) void printArray(int a[], int len); void mergearray(int a[], int head, int mid, int tail); void heapify(int a[], int len, int i) { int left = LEFT(i); int right = RIGHT(i); int max = i; if(left < len && a[left] > a[max]) { max = left; } if(right < len && a[right] > a[max]) { max = right; } if(max != i) { int mid = a[i]; a[i] = a[max]; a[max] = mid; heapify(a, len, max); } } void heapcreate(int a[], int len) { int i = len / 2; for(; i>=0; i--) { heapify(a, len, i); //printArray(a, len); } } void hs(int a[], int len) { int i = len - 1; heapcreate(a, len); //printArray(a, len); for(; i > 0; i--) { int mid = a[i]; a[i] = a[0]; a[0] = mid; heapify(a, i, 0); printArray(a, len); } } void qs(int a[], int start, int end) { if(start < end) { int position = partition(a, start, end); qs(a, start, position - 1); qs(a, position + 1, end); } } int partition(int a[], int start, int end) { int pivot = a[end]; int i = start - 1; int j = start; for(; j < end; j++) { if(a[j] < pivot) { i++; int mid = a[i]; a[i] = a[j]; a[j] = mid; } } i++; a[j] = a[i]; a[i] = pivot; return i; } void printArray(int a[], int len) { int i; for(i = 0; i < len; i++) { printf("%d,", a[i]); } printf("\n"); } int binarySearchUnrecursion(int a[], int start, int end, int key) { int head = start; int tail = end; while(head < tail) { int index = (head + tail) / 2; if(a[index] == key) { return index; } else{ if(a[index] > key) { tail = index - 1; } else { head = index + 1; } } } return -1; } int binarySearch(int a[], int start, int end, int key) { if(start <= end) { int index = (start + end) / 2; if(a[index] == key) { return index; } else{ if(a[index] > key) { return binarySearch(a, start, index-1, key); } else { return binarySearch(a, index + 1, end, key); } } } else{ return -1; } } void ms(int a[], int start, int end) { if(start < end){ int mid = (start + end) / 2; ms(a, start, mid); ms(a, mid + 1, end); mergearray(a, start, mid, end); } } void mergearray(int a[], int head, int mid, int tail) { int i = head; int j = mid + 1; int k = 0; int *temp = (int*)malloc(sizeof(int) * (tail - head + 1)); while(i <= mid && j <= tail) { if(a[i] <= a[j]) { temp[k] = a[i]; i = i + 1; } else { temp[k] = a[j]; j = j + 1; } k = k + 1; } while(i <= mid) { temp[k] = a[i]; k = k + 1; i = i + 1; } while(j <= tail) { temp[k] = a[j]; k = k + 1; j = j + 1; } for(i = 0; i < (tail - head + 1); i++) { a[ head + i] = temp[i]; } } void is(int a[], int len) { int i,j; for(i = 1; i < len; i++) { int val = a[i]; for(j = i - 1; j >=0; j--) { if(a[j] > val){ a[j + 1] = a[j]; if(j == 0) { a[j] = val; continue; } } else{ a[j] = val; continue; } } } } void main() { int a[]={ 5,4,3,2,1 }; int b[]={ 1,2,3,4,5 }; //qs(a, 0, 4); //hs(a, 5); //ms(a, 0, 4); //is(a, 5); printArray(a, 5); //printf("%d", binarySearchUnrecursion(a, 0, 4, 3)); }
相关文章推荐
- 常见几个排序源码及二分查找源码
- 面试常见算法-排序查找算法
- 准备面试需要知道的经典算法--二分查找
- #旧代码# 基本算法练习:常见排序/KMP字符串查找/链表反转
- 面试中常见的数组的操作:遍历,最值,反转,冒泡排序,二分查找(附代码)
- C语言快速排序与二分查找算法示例
- 算法---冒泡排序,快速排序,二分查找(折半查找),选择排序,插入排序
- 经典算法:二分查找、插入排序、选择排序、冒泡排序
- 面试算法:查找排序
- (算法:二分查找)在排序数组中,找出给定数字出现的次数
- 面试算法:lg(k)时间查找两个排序数组合并后第k小的元素
- 经典算法:二分查找、插入排序、选择排序、冒泡排序
- 插入排序的递归实现和二分查找递归实现,算法导论2.3-4和2.3-5
- 笔试面试最常涉及到的12种排序算法(包括插入排序、二分插入排序、希尔排序、选择排序、冒泡排序、鸡尾酒排序、快速排序、堆排序、归并排序、桶排序、计数排序和基数排序)进行了详解。每一种算法都有基本介绍、算
- 算法--Two sum之排序数字二分查找实现
- python 排序算法之 二分查找
- js实现常见的几种算法(数组去重、字符统计、二分查找等)
- 二分查找与旋转排序数组 算法题
- 面试常见算法-排序查找算法
- 面试五: 常见排序 及 算法复杂度