分类 其他 下的文章

看了别人的快速排序实现之后,写了新的一版快排,不同之处就是数组的分割函数。
比上一版看起来更容易理解,而且实现的更加高明一些?(不确定)
var quickSort = function(arr, left , right) {
    if (left < right) {
        var pivotIndex = partition(arr, left, right);
        quickSort(arr, left, pivotIndex - 1);
        quickSort(arr, pivotIndex + 1, right);
    }
}

var partition = function(arr, left, right) {
    var pivotIndex = left;
    var pivotValue = arr[left];
    // 升序排列 所以把基准数 放到后面
    swap(arr, pivotIndex, right);

    var storeIndex = left;
    for (i = left; i < right; i++) {
        if (arr[i] < pivotValue) {
            swap(arr, storeIndex, i);
            storeIndex++;
        }
    }

    swap(arr, storeIndex, right);

    return storeIndex;
}

var swap = function(arr, i, j) {
    var temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}

var arr = [15, 4, 23, 32, 2, 7, 14, 24, 3, 1, 44, 51, 17];
quickSort(arr, 0, arr.length - 1);
console.log(arr);

js 实现的快速排序
目前是升序排列,改成降序只需要将 arr[j] >= midarr[i] <= mid 中的 >= 和 <= 互换
算法优化:

  • 随机取基准数
  • 采用三数取中的方式取基准数
  • 多种排序算法配合 - 当数组元素比较少的时候采用插入排序
const quickSort = (arr, left, right) => {
    if (left < right) {
        // 取第一个数为基准数
        let mid = arr[left];
        let i = left;
        let j = right;
        let temp = 0;

        while (i < j) {
            // 先从 *右边* 开始找 *小于* 基准数的值
            while (i < j && arr[j] >= mid) {
                // 在 i < j 的前提下 直到找到小于基准数的值 本次循环结束
                j--;
            }
            // 再从 *左边* 开始找 *大于* 基准数的值
            while (i < j && arr[i] <= mid) {
                // 在 i < j 的前提下 直到找到大于基准数的值 本次循环结束
                i++;
            }
            // console.log(i, j);
            // 交换 - 这里 肯定是 i <= j 的,加上 i < j 的判断可以少一次无用的赋值
            if (i < j) {
                temp = arr[j];
                arr[j] = arr[i];
                arr[i] = temp;            
            }
        }

        // 到这里的话 i = j
        arr[left] = arr[i];
        arr[i] = mid;
    
        // 再排左半边
        quickSort(arr, left, i - 1);
        // 再排右半边
        quickSort(arr, i + 1, right);
    }
}

var arr = [15, 4, 23, 32, 2, 7, 14, 24, 3, 1, 44, 51, 17];
// var arr = [153, 234, 4364, 565, 32423, 2, 5, 55, 35, 23, 24, 23, 32, 22, 27, 14, 4, 3, 1, 14];

quickSort(arr, 0, arr.length - 1);
console.log(arr);

package main

import (
    "encoding/base64"
    "fmt"
    "io"
    "os"
    "regexp"

    "github.com/imroc/biu"
)

func main() {
    
    s := `二进制字符串`
    s = strings.Replace(s, "_", "1", -1)
    arr := regexp.MustCompile("\\d+").FindAllString(s, -1)

    var r = make([]byte, 0, len(arr))

    for _, x := range arr {
        var a byte
        biu.ReadBinaryString(x, &a)
        r = append(r, a)
    }

    wireteString, _ := base64.StdEncoding.DecodeString(string(r))
    // fmt.Println(wireteString)
    f, err := os.Create("/Users/jiayx/workspace/jiayx/go/src/lean/a.tar.gz") //创建文件
    if err != nil {
        panic(err)
    }
    n, _ := io.WriteString(f, string(wireteString))
    println("写入文件成功, 长度:", n)
}

一直以来我都是看到新系统就不能忍。。想在第一时间更新,今天 macOS 正式版推送了,就立马更新了一波。
说一说遇到的问题吧。

golang 遇到的问题

更新之后,执行 go build 会提示错误

fatal error: MSpanList_Insert

我还以为我昨天把代码改坏了。。。一番查证之后,发现是由于我目前的 golang 1.6 不支持 macOS,更新 golang 到1.7.1之后问题解决。

brew 遇到的问题

还有更新 golang 过程中遇到的问题。
更新 golang 就少不了 brew 的帮忙,在我执行 brew upgrade go 的时候注意到命令行提示:

/usr/local is not writable. You should change the ownership 
and permissions of /usr/local back to your user account: 
sudo chown -R $(whoami) /usr/local

(百度是真的不靠谱...) google 查到是因为 mac 系统升级的问题。只需要按照提示执行 sudo chown -R $(whoami) /usr/local 就 ok 了。

更新: homebrew 更新了,不再需要 修改 /usr/local 的权限了

这是目前我发现的升级 macOS Sierra 遇到的问题,之后遇到会继续更新。

今天刷票,没想到公司ip被12306封了,看到鱼大的刷票软件支持socks5代理,于是想到用服务器搞个代理试试。
步骤如下

  1. 安装 apt-get install dante-server
  2. 创建日志文件夹 mkdir /var/log/sockd
  3. 修改配置文件 vi /etc/danted.conf 写入以下内容

    logoutput: /var/log/sockd/sockd.log
    internal: 服务器ip port = 1080
    external: 服务器ip
    method: username none
    user.privileged: proxyuser
    user.notprivileged: nobody
    user.libwrap: nobody
    client pass {
        from: 0.0.0.0/0 to: 0.0.0.0/0
        log: connect disconnect
    }
    pass {
        from: 0.0.0.0/0 to: 0.0.0.0/0 port gt 1023
        command: bind
        log: connect disconnect
    }
    pass {
        from: 0.0.0.0/0 to: 0.0.0.0/0
        command: connect udpassociate
        log: connect disconnect
    }
    block {
        from: 0.0.0.0/0 to: 0.0.0.0/0
        log: connect error
    }
  4. 启动 /etc/init.d/danted start
  5. 检测是否启动成功 netstat -anp | grep 1080

有个问题就是端口暴露出来 会被各种人扫到。。所以千万不能一直开着