摘要:判读两个链表是否相交以及如果相交它们的第一个公共节点的问题,主要分这么几种情况: 1)两个链表均不含有环 2)两个链表均含有环 对于一个有环一个没有,那么它们即不相交也没有公共节点 首先定义节点的结构struct Node{int value;Node *next;}; 判断链表是否有环...
阅读全文
摘要:去一家IT公司面试,当时面试官问的,可惜没出来,后来上网搜了一下,找到了解决方案,问题:已知随机数函数rand5(),可以均匀随机生成1~5,编写随机函数rand7(),可以随机生成1~7,并且保持均匀性。当时,想的是rand5()+ rand5()%3,但是这样是无法保证期均匀性的。后来上网找到了...
阅读全文
摘要:二分搜索代码如下:int BinarySearch(int t, int a[], int n){ int l = 0; int u = n-1; int i = -1; while(1){ if(l > u){ i = -1; break; } int m = (l+u)/2; if(a[m] < t){ l = m + 1; }else if(a[m] == t){ i = m; break; }else{ u = m - 1; } } return i;} 如果在...
阅读全文
摘要:堆排序(HeapSort) 堆排序主要是利用了数据结构堆的相关性质来进行排序操作。简单来说,堆的结构图类似于二叉树,有两种堆,最大值堆和最小值堆,在最大值堆中,堆的每一个节点的值,都大于该节点的两个子节点(left,right)的值,所以,根节点的值最大,类似最小值堆则相反。代码如下:void HeapSort(int *A, int n){ BulidMaxHeap(A,n); for(int i = n-1; i>=1; i--){ Exchange(A[0],A[i]); heapsize[A]--; MaxHeapify(A, 0); }}void BuildM...
阅读全文
摘要:计数排序 计数排序的可以在线性时间O(n)内完成对长度为n的数组进行排序,但是,该算法的缺陷主要有两点,一是通过牺牲了空间来换取时间的高效,二是,对数组元素的范围有要求,不能过大。 代码如下://A[1...n] in the range of (0...k)void CountingSort(int *A, int *B, int k, int n){ int *C = new int[k]; memset(C, 0, sizeof(C)*sizeof(int)); for(int i = 0; i <= n-1; i++){ C[A[i]] = C[A[i]] + 1; } ...
阅读全文
摘要:1.快速排序 快速排序的基本思路属于分治算法的一种,通过选择数组中的某一个元素作为分界点(key),大于key的元素放置在数组右边,小于key的元素放置在数组的左边,然后通过递归调用该过程来实现排序算法。 代码如下:int Partition(int *A, int p, int q){ int i = p; int key = A[i]; for(int j = p+1; j <= q, j++){ if(A[j]<key){ i++; int temp = A[i]; A[i] = A[j]; A[j] = temp; } } ...
阅读全文
摘要:归并排序(递归)void MergeSort(int *A, int n){ if(n == 1){ return ; } int *C = new int[n]; int l1 = n/2; int l2 = n-l1; MergeSort(A, l1); MergeSort(&A[l1], l2); for(int i = 0, j = l1, k = 0; k < n;){ while(i!=l1 && j != n){ if(A[i]<A[j]){ C[k] = A[i]; k++; i++; }else{ ...
阅读全文
摘要:1.插入排序void InsertSort(int *A, int n){// A is a int point point to a int Array and n is the length of the Array for(int j = 1; j < n; j++) { int key = A[j]; int i = j - 1; while(key < A[i] && i >=0 ) { A[i+1] = A[i]; i = i-1; } A[i+1] = key; } return ;}2.冒泡排序void Bub...
阅读全文