笔试之算法
1. 排序算法
1.1 6个2T的盘中存满了整型数,总共8G内存 再给新的6个2T的硬盘和8G内存,问怎样把之前的数排序之后放入新的硬盘之中?
1.2 求n个数中前K大的数,要写代码
过程说明:
首先建立一个临时数组,数组大小为K,从N中读取K个数,降序全排序(排序算法可以自行选择,考虑数组的无序性,可以考虑选择快速排序算法),然后依次读入其余N - K个数进来和第K名元素比较,大于第K名元素的值则插入到合适位置,数组最后一个元素溢出,反之小于等于第K名元素的值不进行插入操作。只待循环完毕返回临时数组的K个元素,即是需要的K个最大数。同算法一其平均时间复杂度为O(KLogK + (N - K))。具体代码实现可以自行完成。
#define K 10 void swap(int* a, int *b) { int tmp = *a; *a = *b; *b = tmp; } int partition(int a[], int low, int high) { int privotKey = a[low]; while(low < high) { while(low < high && a[high] <= privotKey) --high; swap(&a[low], &a[high]); while(low < high && a[low] >= privotKey) ++low; swap(&a[low], &a[high]); } } void quickSort(int a[], int low, int high) { if(low < high) { int privotLoc = partition(a, low, high); quickSort(a, low, privotLoc - 1); quickSort(a, privotLoc + 1, high); } } void print(int a[], int len) { int i; for(i = 0; i < len; ++i) printf("%d\t", a[i]); printf("\n"); } //a from big to small, b is not known void joinSort(int a[], int len_a, int b[], int len_b) { int i; for(i = 0; i < len_b; ++i)//for b[] { int index = len_a-1; if(b[i] > a[index]) { while(b[i] > a[index] && index >= 0) index--; //后移动 int j; for(j = len_a-1; j > index+1; --j) { a[j] = a[j-1]; } a[index+1] = b[i]; } } } void maxk(int a[], int len) { int temp[K]; int i = 0; for(i = 0; i < K; ++i) { temp[i] = a[i]; } quickSort(temp, 0, K - 1); joinSort(temp, K, a+K, len-K); print(temp, K); }
1.3 堆排序