一千万个随机数排序,如何24秒蜕变成3秒?如何从700M内存消耗变成200M?

上一篇文章写的十分的烂,经过科普看语言源码实现用的是quicksort实现的底层排序,在这里模仿一下,勿喷!
package main

import (
	"fmt"
	"math/rand"
	"runtime"
	"sort"
	"time"
)

func mergeonce(l, r []int) []int {
	m := make([]int, 0, len(l)+len(r))
	i, j := 0, 0
	if i < len(l) && j < len(r) {
		for {
			if l[i] < l[j] {
				m = append(m, l[i])
				i++
				if i == len(l) {
					break
				}
			} else {
				m = append(m, l[j])
				j++
				if j == len(r) {
					break
				}
			}
		}
	}
	m = append(append(m, l[i:]...), r[j:]...)
	return m
}

func merge(in chan []int, out chan []int) {
	var next chan []int
	var l []int
	for list := range in {
		if l == nil {
			l = list
			continue
		}

		r := list

		if next == nil {
			next = make(chan []int, 1)
			go merge(next, out)
		}

		next <- mergeonce(l, r)
		l = nil
	}
	if next == nil {
		out <- l
	} else {
		if l != nil {
			next <- l
		}
		close(next)
	}
}

func main() {
	runtime.GOMAXPROCS(2)
	ch := make(chan []int, 1)

	const Num = 100
	const WNum = 100
	fmt.Println(time.Now())
	go func(n int, out chan []int) {
		for i := 0; i < n; i++ {
			list := make([]int, 1000)
			for j := range list {
				list[j] = rand.Int()
			}

			sort.Ints(list)
			out <- list
		}
		close(out)
	}(Num*WNum, ch)

	out := make(chan []int)
	go merge(ch, out)
	list := <-out
	fmt.Println(time.Now())
	fmt.Println(len(list))
	fmt.Println(sort.IntsAreSorted(list))
}

时间: 2024-10-14 20:06:38

一千万个随机数排序,如何24秒蜕变成3秒?如何从700M内存消耗变成200M?的相关文章

做了个实验,给一千万个随机数排序,用了24秒.不过内存使用有些高,下面是代码.使用的是双核.

maste.go package main import ( "fmt" "os" "runtime" "test" "time" ) var x chan []int = make(chan []int, 1) var Num int = 100 var WNum int = 100 func main() { fmt.Println(time.Now()) var list1, list2 []int

腾讯面试题,js处理1千万条数据排序并且页面不卡顿

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" con

ASIHTTPRequest 记录过去5秒的平均流量字节/秒

//记录过去5秒的平均流量字节/秒 NSLog(@"%llu",[ASIHTTPRequest averageBandwidthUsedPerSecond]); ASIHTTPRequest 记录过去5秒的平均流量字节/秒

一秒快速抠图一秒图片高清处理

作为运营人,作为平面设计师.我们离不开与图片设计.图片处理等相关的工作.在运营工作新人中,很多新的运营专员/运营者对Ps并不是特别熟练.我们也知道除外PS还有其它非主流的抠图软件,但是大体都是描绘一个边然后软件进行抠图处理.但是很多时候这种软件抠出来的图并不标准,无论是图片边缘的细节还是整体的处理. 这篇文章给运营者带来两个运营工作中图片处理的小技巧.如何一秒快速抠图?如何一秒图片高清处理? 一秒快速抠图 在演示之前,我在百度图片中随机选择了几张图,下图是给大家演示如何快速的1秒抠图 . 一秒图

Go语言排序一千万个随机数.开的双核.用了120秒,不知道怎么优化.

package main import ( "fmt" "os" "runtime" "test" "time" ) var x chan []int = make(chan []int, 1) var Num int = 10 var WNum int = 100 func main() { fmt.Println(time.Now()) var list1, list2 []int var R chan

Go语言用堆排序的方法进行一千万个int随机数排序.

上篇文章用的是quicksort方法排序,但是如果用快速排序法对重复率很高的slice排序的时候,时间复杂度会激增,速度相当慢 所以尝试了一下堆排序,实验结果,感觉挺好的.下面是代码,大家可以参考一下,这个是建立的大顶堆. 二叉树的特性: 最后一个非叶子节点 : root = length/2(当length为奇数的时候root向下取整) 在GO语言中的索引位置:root - 1, 左右孩子节点:child_l = 2*root,索引位置:child_l-1,右孩子的节点: 2*root+1 索

通向高可扩展性之路(推特篇) ---- 一个推特用来支撑1亿5千万活跃用户、30万QPS、22MB每秒Firehose、以及5秒内推送信息的架构

原文链接:http://highscalability.com/blog/2013/7/8/the-architecture-twitter-uses-to-deal-with-150m-active-users.html 写于2013年7月8日,译文如下: “可以解决推特所面临的挑战”的玩具般的方案是一个常用在扩展性上的比喻.每个人都觉得推特很容易实现.稍微具备一些系统架构的知识我们就可以构建一个推特,就这么简单.但是根据推特软件开发部门的VP Raffi Krikorian在 Timelin

SQL反模式学习笔记16 使用随机数排序

2014-10-15 10:06:48 目标:随机排序,使用高效的SQL语句查询获取随机数据样本. 反模式:使用RAND()随机函数 SELECT * FROM Employees AS e ORDER BY RAND() Limit 1 缺点:无法利用索引,每次选择的时候都不同且不可预测.进行全表遍历,性能极差. 如何识别反模式:当出现以下情况时,可能是反模式 1.在SQL中,返回一个随机行速度非常慢: 2.要获取所有的记录然后随机一个.要如何增加程序可使用的内存大小? 3.有些列出现的频率比

计算从现在到明年的倒计时(包含天,时,分,秒),每秒更新一次

function timeCount(){ var nowTime=Date.parse(new Date()); var toTime=Date.parse(new Date('2018 01 01')); var jiange=(toTime-nowTime)/1000; var day=Math.floor(jiange/3600/24); var hh=Math.floor((jiange%(3600*24))/(60*60)); var mm=Math.floor(((jiange%(