
算法
陈鹏万里
Gopher
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
算法代码实现之堆排序,Java实现
封装成类:package com.roc.algorithms.sort;/** * 堆排序 * a[0]不用,实际元素从角标1开始 * 父节点元素大于子节点元素 * 左子节点角标为2*k * 右子节点角标为2*k+1 * 父节点角标为k/2 * * @author roc */public class HeapSort { public static voi原创 2016-03-01 20:52:25 · 598 阅读 · 0 评论 -
算法代码实现之冒泡排序,C/C++ 实现
两种类似的方式:#include //交换数组元素void swap(int *a,int i,int j){ int t = a[i]; a[i] = a[j]; a[j] = t;}//打印输出数组void print_arr(int *a,int len){ int i; if(len<1){ //数组长度必须大于0原创 2016-02-27 20:28:12 · 3307 阅读 · 0 评论 -
算法代码实现之Union-Find,Java实现,quick-find、quick-union、加权quick-union(附带路径压缩优化)
本算法主要解决动态连通性一类问题,这里尽量用精炼简洁的话来阐述。数据结构描述:有N个节点(索引0~N-1),可以查询节点数量可以连接两个节点可以查询两个节点是否连通算法大致设计思路:每个节点初始化为不同的整数标记通过一个辅助函数查询某个节点的标记值如果两节点标记相同,说明两节点是连通的抽象基类:package com.roc.algorithms.u原创 2016-02-28 14:48:47 · 2213 阅读 · 0 评论 -
算法代码实现之插入排序,C/C++实现
封装成函数://交换数组元素void swap(int *a,int i,int j){ int t = a[i]; a[i] = a[j]; a[j] = t;}//插入排序void insertion_sort(int *a,int len){ int i,j; if (len < 2) { return;原创 2016-02-28 15:42:54 · 547 阅读 · 0 评论 -
算法代码实现之插入排序,Java实现
封装成类:package com.roc.algorithms.sort;/** * 插入排序 * * @author roc */public class InsertionSort { //交换数组元素 private static void swap(int[] a, int i, int j) { int t = a[i];原创 2016-02-28 15:49:46 · 535 阅读 · 0 评论 -
算法代码实现之希尔排序,C/C++实现
封装成函数://交换数组元素void swap(int *a,int i,int j){ int t = a[i]; a[i] = a[j]; a[j] = t;}//希尔排序void shell_sort(int *a,int len){ int h=1,i,j; while(h<len/3) //寻找合适的间隔h {原创 2016-02-28 16:20:40 · 883 阅读 · 0 评论 -
算法代码实现之希尔排序,Java实现
封装成类:package com.roc.algorithms.sort;/** * 希尔排序 * * @author roc */public class ShellSort { //交换数组元素 private static void swap(int[] a, int i, int j) { int t = a[i]; a[i原创 2016-02-28 16:26:40 · 1715 阅读 · 0 评论 -
算法代码实现之归并排序,C/C++实现,自顶向下与自底向上两种方式
封装成函数merge_sort_up_to_down(自顶向下方式)和merge_sort_down_to_up(自底向上方式):#include //归并操作void merge(int *a,int *aux,int lo,int mid,int hi){ int i,j,k; for(k=lo; k<=hi; k++) { aux[k] =原创 2016-02-28 22:05:53 · 2617 阅读 · 0 评论 -
算法代码实现之归并排序,Java实现,自顶向下与自底向上两种方式
封装成类:package com.roc.algorithms.sort;/** * 归并排序 * * @author roc */public class MergeSort { //自顶向下方式 public static void sortUpToDown(int[] a) { int[] aux = new int[a.length];原创 2016-02-28 22:18:43 · 1566 阅读 · 0 评论 -
算法代码实现之Union-Find,C++实现,quick-find、quick-union、加权quick-union(附带路径压缩优化)
本算法主要解决动态连通性一类问题,这里尽量用精炼简洁的话来阐述。数据结构描述:有N个节点(索引0~N-1),可以查询节点数量可以连接两个节点可以查询两个节点是否连通算法大致设计思路:每个节点初始化为不同的整数标记通过一个辅助函数查询某个节点的标记值如果两节点标记相同,说明两节点是连通的抽象基类:class UnionFind{public:原创 2016-02-29 09:49:08 · 2771 阅读 · 0 评论 -
算法代码实现之快速排序,Java实现
封装成类:package com.roc.algorithms.sort;/** * 快速排序 * * @author roc */public class QuickSort { public static void sort(int[] a) { sort(a, 0, a.length - 1); } private static vo原创 2016-02-29 19:34:32 · 698 阅读 · 0 评论 -
算法代码实现之三向切分快速排序,Java实现
封装成类:package com.roc.algorithms.sort;/** * 三向切分快速排序 * 适合有较多重复元素的排序算法 * * @author roc */public class ThreeWayQuickSort { public static void sort(int[] a) { sort(a, 0, a.length -原创 2016-02-29 21:46:54 · 1775 阅读 · 0 评论 -
算法代码实现之快速排序,C/C++实现
封装成函数://快速排序void quick_sort(int *a,int len){ sort(a,0,len-1);}void sort(int *a,int lo,int hi){ int i,j,k; if(lo>=hi) { return; } k = partition(a,lo,hi); sort原创 2016-02-29 19:49:15 · 625 阅读 · 0 评论 -
算法代码实现之三向切分快速排序,C/C++实现
封装成函数://交换数组元素void swap(int *a,int i,int j){ int t = a[i]; a[i] = a[j]; a[j] = t;}//在lt之前的(lo~lt-1)都小于中间值//在gt之前的(gt+1~hi)都大于中间值//在lt~i-1的都等于中间值//在i~gt的都还不确定(最终i会大于gt,即不确定的将不复存在)原创 2016-02-29 22:08:48 · 857 阅读 · 0 评论 -
求两圆相交的交点的方法
最近研究三角定位算法,研究了下怎样求两圆的交点,现给出求解方法:原创 2016-07-25 00:02:30 · 13284 阅读 · 3 评论 -
求两圆交点算法代码实现(Golang/Go语言)
数学求解原理请看:http://blog.youkuaiyun.com/qq245671051/article/details/52017403下面是golang代码实现:package mainimport ( "math")//代表一个点,包含横纵坐标type Point struct { X, Y float64}//代表一个圆,包含横纵坐标及半径原创 2016-07-25 15:10:56 · 1762 阅读 · 0 评论 -
golang(Go语言) byte/[]byte 与 二进制形式字符串 互转
效果把某个字节或字节数组转换成字符串01的形式,一个字节用8个”0”或”1”字符表示。比如: byte(3) –> “00000011” []byte{1,2,3} –> “[00000001 00000010 00000011]” “[00000011 10000000]” –> []byte{0x3, 0x80}开源库 biu实际上我已经将其封装到一个开源库了(biu),其中的一个功能就能原创 2016-09-28 20:03:49 · 55353 阅读 · 0 评论 -
求n次方的高效算法
**注:**次幂n为整数,底数可以是整数、小数、矩阵等(只要能进行乘法运算的 举个求整数的n次方的例子(Go语言版):``` gofunc pow(x, n int) int { ret := 1 // 结果初始为0次方的值,整数0次方为1。如果是矩阵,则为单元矩阵。 for n != 0 { if n%2 != 0 { ret = ret * x } n /= 2 x = x *原创 2017-04-22 00:30:29 · 10491 阅读 · 0 评论 -
算法代码实现之选择排序,Java实现
封装成类:/** * 选择排序 * * @author roc */public class SelectionSort { //交换数组元素 private static void swap(int[] a, int i, int j) { int t = a[i]; a[i] = a[j]; a[j] = t;原创 2016-02-27 21:20:24 · 575 阅读 · 0 评论 -
算法代码实现之选择排序,C/C++ 实现
封装成函数://交换数组元素void swap(int *a,int i,int j){ int t = a[i]; a[i] = a[j]; a[j] = t;}//选择排序void selection_sort(int *a,int len){ int m = len-1; //以免每次循环判断都运算 int i,j,k; fo原创 2016-02-27 21:14:06 · 907 阅读 · 1 评论 -
算法代码实现之冒泡排序,Java实现
两种类似的方式:/** * 冒泡排序 * @author roc */public class BubbleSort { //交换数组元素 private static void swap(int[] a,int i,int j){ int t = a[i]; a[i] = a[j]; a[j] = t; }原创 2016-02-27 20:45:31 · 1409 阅读 · 0 评论 -
算法代码实现之堆排序,C/C++实现
封装成函数://交换数组元素void swap(int *a,int i,int j){ int t = a[i]; a[i] = a[j]; a[j] = t;}//下沉(由上至下的堆有序化)void sink(int *a,int k,int N){ while (1) { int i = 2 * k; i原创 2016-03-01 21:03:58 · 943 阅读 · 0 评论 -
算法代码实现之选出第k小元素、中位数、最小的k个元素(线性复杂度),Java实现
封装成类:package com.roc.algorithms.common;import java.util.Arrays;/** * 选出第k小元素、中位数、最小的k个元素(线性复杂度) * * @author roc */public class Select { //选出第k小元素,k为1~a.length public static int se原创 2016-03-03 12:14:49 · 3062 阅读 · 0 评论 -
算法代码实现之选出第k小元素、中位数、最小的k个元素(线性复杂度),C/C++实现
封装成函数:#include void swap(int *a,int i,int j){ int t = a[i]; a[i] = a[j]; a[j] = t;}int partition(int *a,int lo,int hi){ int i,j; i=lo; j=hi+1; while(1) {原创 2016-03-03 12:39:33 · 1211 阅读 · 0 评论 -
算法代码实现之二分法查找,Java实现
封装成类:package com.roc.algorithms.search;/** * 二分法查找 * * @author roc */public class BinarySearch { /** * @param a 升序排列的数组 * @param k 待查找的整数 * @return 如果查到有就返回对应角标,没有就返回-1原创 2016-03-03 18:46:39 · 2513 阅读 · 0 评论 -
算法代码实现之二分法查找,C/C++实现
封装成函数://二分法查找//数组a是升序的,len为数组长度//k为待查找的整数//如果查到有就返回对应角标,//没有就返回-1int search(int *a,int len, int k){ int lo = 0, hi = len - 1; while (lo <= hi) { int m = (lo + hi) >> 1;原创 2016-03-03 18:52:58 · 1872 阅读 · 0 评论 -
Golang二叉查找树
为简单起见,键值均为整型。定义接口(tree.go):type Tree interface { Put(k, v int) //新增或修改 Get(k int) int //查询 Delete(k int) //删除 Size() int //树的大小 Min() int //最小键 DeleteMin() //删除最小键}二叉查找树(原创 2016-03-07 20:44:50 · 1089 阅读 · 0 评论 -
算法代码实现之二分法查找,Golang(Go语言)实现
封装成函数://二分法查找//切片s是升序的//k为待查找的整数//如果查到有就返回对应角标,//没有就返回-1func BinarySearch(s []int, k int) int { lo, hi := 0, len(s)-1 for lo hi { m := (lo + hi) >> 1 if s[m] k { lo = m + 1 } else if s[m]原创 2016-03-03 18:40:02 · 2903 阅读 · 0 评论 -
算法代码实现之选出第k小元素、中位数、最小的k个元素(线性复杂度),Golang(Go语言)实现
封装成函数://选出第k小元素,k为1~len(s)func SelectKthMin(s []int, k int) int { k-- lo, hi := 0, len(s)-1 for { j := partition(s, lo, hi) if j k { lo = j + 1 } else if j > k { hi = j - 1 } else { r原创 2016-03-02 21:25:48 · 1478 阅读 · 0 评论 -
算法代码实现之堆排序,Golang(Go语言)实现
封装成函数://堆排序//s[0]不用,实际元素从角标1开始//父节点元素大于子节点元素//左子节点角标为2*k//右子节点角标为2*k+1//父节点角标为k/2func HeapSort(s []int) { N := len(s) - 1 //s[0]不用,实际元素数量和最后一个元素的角标都为N //构造堆 //如果给两个已构造好的堆添加一个共同父节点, //将新添加的节点作一次下原创 2016-03-01 20:41:33 · 2532 阅读 · 2 评论 -
算法代码实现之三向切分快速排序,Golang(Go语言)实现
封装成函数://三向切分快速排序func ThreeWayQuickSort(s []int) { sort3way(s, 0, len(s)-1)} //在lt之前的(lo~lt-1)都小于中间值//在gt之前的(gt+1~hi)都大于中间值//在lt~i-1的都等于中间值//在i~gt的都还不确定(最终i会大于gt,即不确定的将不复存在)func sort3way(s []int,原创 2016-02-29 21:34:47 · 1194 阅读 · 0 评论 -
算法代码实现之快速排序,Golang(Go语言)实现
封装成函数://快速排序func QuickSort(s []int) { sort(s, 0, len(s)-1)} func sort(s []int, lo, hi int) { if lo >= hi { return } k := partition(s, lo, hi) sort(s, lo, k) sort(s, k+1, hi)} func partition(s [原创 2016-02-29 19:18:33 · 1400 阅读 · 0 评论 -
算法代码实现之归并排序,Golang(Go语言)实现,自顶向下与自底向上两种方式
封装成函数://自顶向下归并排序func MergeSortUpToDown(s []int) { aux := make([]int, len(s)) //辅助切片 mergeSortUpToDown(s, aux, 0, len(s)-1)} //自底向上归并排序func MergeSortDownToUp(s []int) { aux := make([]int, len(s))原创 2016-02-28 21:23:56 · 1968 阅读 · 0 评论 -
算法代码实现之希尔排序,Golang(Go语言)实现
封装成函数:package sort func ShellSort(a []int) { n := len(a) h := 1 for h n/3 { //寻找合适的间隔h h = 3*h + 1 } for h >= 1 { //将数组变为间隔h个元素有序 for i := h; i n; i++ { //间隔h插入排序 for j := i; j >= h &&原创 2016-02-28 16:12:28 · 1399 阅读 · 0 评论 -
算法代码实现之插入排序,Golang(Go语言)实现
封装成函数://插入排序func InsertionSort(s []int) { n := len(s) if n 2 { return } for i := 1; i n; i++ { for j := i; j > 0 && s[j] s[j - 1]; j-- { swap(s, j, j - 1) } }} func swap(slice []int, i i原创 2016-02-28 15:33:23 · 1073 阅读 · 0 评论 -
算法代码实现之Union-Find,Golang(Go语言)实现,quick-find、quick-union、加权quick-union(附带路径压缩优化)
本算法主要解决动态连通性一类问题,这里尽量用精炼简洁的话来阐述。数据结构描述:有N个节点(索引0~N-1),可以查询节点数量可以连接两个节点可以查询两个节点是否连通算法大致设计思路:每个节点初始化为不同的整数标记通过一个辅助函数查询某个节点的标记值如果两节点标记相同,说明两节点是连通的用一个包专门处理union-find算法(unionfind)定义原创 2016-02-28 12:34:27 · 2228 阅读 · 0 评论 -
算法代码实现之选择排序,Golang(Go语言)实现
封装成函数://交换数组元素func swap(slice []int, i int, j int) { slice[i], slice[j] = slice[j], slice[i]} //选择排序func SelectionSort(s []int) { l := len(s) //以免每次循环判断都运算 m := len(s)-1 for i:=0;im;i++ { k:原创 2016-02-27 21:03:34 · 1244 阅读 · 0 评论 -
算法代码实现之冒泡排序,Golang(Go语言)实现
有两种相似的方式:func swap(slice []int, i int, j int) { slice[i], slice[j] = slice[j], slice[i]} //第一种冒泡排序func BubbleSort1(slice []int) { length := len(slice) max := length - 1 for i := 0;原创 2016-02-27 19:59:39 · 1348 阅读 · 0 评论 -
golang动态规划求解最大连续子数组和
// 求最大连续子数组和func MaxSubArray(arr []int) int { currSum := 0 maxSum := arr[0] for _, v := range arr { if currSum > 0 { currSum += v } else { currSum =原创 2017-05-15 16:17:25 · 1298 阅读 · 0 评论