做了个实验,给一千万个随机数排序,用了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
	var R chan []int = make(chan []int, 1)
	for i := 0; i < WNum; i++ {
		go Chan(Num, R)
	}
	for i := 0; i < WNum; i++ {
		select {
		case y := <-R:
			if len(list1) == 0 {
				list1 = y
			} else {
				list2 = y
				list1 = test.Merge(list1, list2)
			}
		}
	}
	fmt.Println(time.Now())
	fmt.Println(len(list1))
	File, _ := os.OpenFile("c.txt", os.O_RDWR|os.O_CREATE, 0777)
	File.Write([]byte(fmt.Sprint(list1)))
	File.Close()
}

func Chan(Num int, R chan []int) {
	var list1, list2 []int
	runtime.GOMAXPROCS(2)
	for i := 0; i < Num; i++ {
		go func() {
			x <- test.Rand_list(1000)
		}()
	}
	for i := 0; i < Num; i++ {
		select {
		case y := <-x:
			if len(list1) == 0 {
				list1 = y
			} else {
				list2 = y
				list1 = test.Merge(list1, list2)
			}
		}
	}
	R <- list1
}

test目录下:

package test

func Merge(list1, list2 []int) []int {
	list1_Num := len(list1)
	list2_Num := len(list2)
	var j int = 0
	var list3 []int
	for i, _ := range list1 {
	This:
		if list1[i] <= list2[j] {
			list3 = append(list3, list1[i])
			if i == list1_Num-1 {
				for z := j; z < list2_Num; z++ {
					list3 = append(list3, list2[z])
				}
				break
			}
		} else {
			if j <= list2_Num-1 {
				list3 = append(list3, list2[j])
				if j == list2_Num-1 {
					for j := i; j < list1_Num; j++ {
						list3 = append(list3, list1[j])
					}
					break
				}
				j++
				goto This
			}
		}
	}
	return list3
}
package test

import (
	"math/rand"
)

func Rand_list(Num int) []int {
	var list []int
	for i := 0; i < Num; i++ {
		list = append(list, rand.Intn(100000))
	}
	for i := 0; i < Num; i++ {
		for j := i + 1; j < Num; j++ {
			if list[i] > list[j] {
				list[i], list[j] = list[j], list[i]
			}
		}
	}
	return list
}
时间: 2024-08-05 01:27:37

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

一千万个随机数排序,如何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 i

用梯度下降做点小实验

赶在国庆回家前做点小实验== 利用梯度下降法去拟合任意你想拟合的东西,哈哈 自己想出来的曲线: 目标函数: 其中: , 然后计算迭代式: 其中: k表示第k次迭代, 至此,有了梯度方向就可以计算啦,附上c++代码: #include<iostream> #include<vector> #include<ctime> using namespace std; int main() { //产生数据 srand(time(NULL)); vector<vector&

刘武青 老师 做的那些 实验 会对 未来 科技 的 井喷式 发展 打下 丰厚 基础

刘武青 老师 做的那些 实验 会对 未来 科技 的 井喷式 发展 打下 丰厚 基础, 参考: <大家看看 刘武青 老师 的 这个 实验 能用 相对论 解释么?>    https://www.cnblogs.com/KSongKing/p/11192543.html <科学发展的趋势 和 当代科技向未来发展要做的几件大事>    https://www.cnblogs.com/KSongKing/p/11195218.html 原文地址:https://www.cnblogs.co

关于怎么做大发彩票源码下载高质量的代码,给你提供一些解决方案

写出大发彩票源码下载论坛:haozbbs.com Q1446595067高质量代码,并不是搭建空中楼阁,需要有一定的基础:这里我重点强调与代码质量密切相关的几点: 掌握好开发语言,比如做Android就必须对Java足够熟悉,<Effective Java>一书就是教授大家如何更好得掌握Java, 写出高质量Java代码. 熟悉开发平台, 不同的开发平台,有不同的API, 有不同的工作原理,同样是Java代码,在PC上写与Android上写很多地方不一样,要去熟悉Android编程的一些特性,

腾讯面试题,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

在ASP.NET下做了一个实验MVC的小东西

星期五下班前一时兴起,对MVC发表了一点看法.后来就想干脆弄个小东西来验证一些自己的想法帮组理清思路.所要源代码的免了,3个小时的急就章实在是乱得可以,既没有好的架构,也没有任何代码质量可言,主要是实现了对MVC的一点想法.所以拿出来大家给参考一下.申明:不是典型的MVC 在这里我参考了Web.Py的一些做法,首先我们将Url当作一种资源,一个典型的Url,如下: http://www.x.com/Index/view/2007/10/21 我们将从/Index/Topic/2007/10/21

Dynamips做CCNA的实验,说是找不到telnet的解决方案

01.如果你的系统是32位的系统. 控制面板-程序与功能-启动或关闭windows功能-开启telnet(重启计算机就可以用telnet了) 02.如果你的系统是64位的系统. (1)控制面板-程序与功能-启动或关闭windows功能-开启telnet (2)重启电脑 (2)在C:\Windows\System32找到telnet.exe 复制到 C:\Windows\SysWOW64 目录下,就可以正常的telnet了

go语言笔记——go是有虚拟机runtime的,不然谁来做GC呢,总不会让用户自己来new和delete进行内存管理吧,还有反射!Go 的 runtime 嵌入到了每一个可执行文件当中

2.7 Go 运行时(runtime) 尽管 Go 编译器产生的是本地可执行代码,这些代码仍旧运行在 Go 的 runtime(这部分的代码可以在 runtime 包中找到)当中.这个 runtime 类似 Java 和 .NET 语言所用到的虚拟机,它负责管理包括内存分配.垃圾回收(第 10.8 节).栈处理.goroutine.channel.切片(slice).map 和反射(reflection)等等. runtime 主要由 C 语言编写(Go 1.5 开始自举),并且是每个 Go 包

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

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