随笔分类 -  Algorithm

算法
两个链表相交以及第一个公共节点的问题
摘要:判读两个链表是否相交以及如果相交它们的第一个公共节点的问题,主要分这么几种情况: 1)两个链表均不含有环 2)两个链表均含有环 对于一个有环一个没有,那么它们即不相交也没有公共节点 首先定义节点的结构struct Node{int value;Node *next;}; 判断链表是否有环... 阅读全文

posted @ 2014-11-10 00:31 碎雨 阅读(2208) 评论(0) 推荐(0) 编辑

关于随机数的一道面试题
摘要:去一家IT公司面试,当时面试官问的,可惜没出来,后来上网搜了一下,找到了解决方案,问题:已知随机数函数rand5(),可以均匀随机生成1~5,编写随机函数rand7(),可以随机生成1~7,并且保持均匀性。当时,想的是rand5()+ rand5()%3,但是这样是无法保证期均匀性的。后来上网找到了... 阅读全文

posted @ 2014-09-15 15:57 碎雨 阅读(757) 评论(0) 推荐(0) 编辑

搜索-二分搜索
摘要:二分搜索代码如下: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;} 如果在... 阅读全文

posted @ 2013-03-12 17:32 碎雨 阅读(152) 评论(0) 推荐(0) 编辑

排序算法-堆排序
摘要:堆排序(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... 阅读全文

posted @ 2013-03-12 17:24 碎雨 阅读(298) 评论(0) 推荐(0) 编辑

排序算法-计数排序
摘要:计数排序 计数排序的可以在线性时间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; } ... 阅读全文

posted @ 2013-03-12 16:30 碎雨 阅读(266) 评论(0) 推荐(0) 编辑

排序算法-(随机)快速排序(递归)
摘要: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; } } ... 阅读全文

posted @ 2013-03-12 16:20 碎雨 阅读(3420) 评论(0) 推荐(0) 编辑

排序算法-归并排序(递归)
摘要:归并排序(递归)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{ ... 阅读全文

posted @ 2013-03-12 15:50 碎雨 阅读(151) 评论(0) 推荐(0) 编辑

排序算法-插入排序/冒泡排序
摘要: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... 阅读全文

posted @ 2013-03-12 15:42 碎雨 阅读(188) 评论(0) 推荐(0) 编辑

导航

点击右上角即可分享
微信分享提示