「这是我参与2022首次更文挑战的第12天,活动详情查看:2022首次更文挑战」
前言
上篇文章写了一下C++的vector动态数组基本用法,今天来写一下C++的冒泡排序。来一个巨大的随机数组使用冒泡排序看看golang和C++的效率区别
冒泡排序
冒泡排序是一个非常经典的数组排序算法,非常简单容易理解,稳定效率不是很高,原理是遍历所有元素,再把所有元素跟相近的元素对比,根据大小来交换位置,最好的时间复杂度为O(n),平均时间复杂度为O(n^2)。
C++冒泡排序
#include <iostream>
#include <time.h>
using namespace std;
int main() {
int* arr = new int[100000]; // 创建一个 个元素的数组
srand(time(NULL)); // 随机种子
for (int i = 0; i < 100000; i++) {
arr[i] = rand() % (1000000 - 1 + 1) + 1;
}
int befor_begin_arr[100], after_begin_arr[100];
for (int i = 0; i <= 99; i++) befor_begin_arr[i] = arr[i];
for(int i = 0; i < 99; i++)
{
cout << befor_begin_arr[i] << " ";
}
cout << '\n' << endl;
//开始
time_t start_time, end_time;
start_time = time(NULL);
int temp;
for (int i = 0; i != 100000; ++i)
{
for (int j = 0; j != 100000; ++j)
{
if (arr[i] < arr[j])
{
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
end_time = time(NULL);
printf("耗时 %f 秒\n", difftime(end_time, start_time));
for (int i = 0; i <= 99; i++) after_begin_arr[i] = arr[i];
for (int i = 0; i < 99; i++)
{
cout << after_begin_arr[i] << " ";
}
}
随机前都打印了前100个元素,然后排序前记录时间,排序后记录时间,排序完成后计算排序时长。
C++随机的时候要选取一个随机种子。不然就是伪随机,srand(time(NULL)); 这句代码的意识是使用系统时间来初始化系统随机数的种子值。每次使用rand随机的时候就会用系统时间来确定随机数,如果没有这句代码,那么所有的随机都是一样
Golang冒泡排序
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
var rand_arr = [100000]int{}
for i := 0; i < 99999; i++ {
rand_arr[i] = rand.Intn(1000000)
}
fmt.Println(rand_arr[0:100]) //输出前100个元素
begin_time := time.Now() //开始时间
for i := 0; i != 100000; i++ {
for j := 0; j != 100000; j++ {
if rand_arr[i] < rand_arr[j] {
rand_arr[i], rand_arr[j] = rand_arr[j], rand_arr[i]
}
}
}
run_time := time.Since(begin_time) // 从开始到当前所消耗的时间
fmt.Printf("耗时:%s", run_time) //打印输出时间
fmt.Println()
fmt.Println(rand_arr[0:100]) //输出前100个元素
}
Golang看起来就比C++简化很多,素组可以用切片的方式访问,也不用随机种子,使用
math/rand包就能快速生成随机数,然后变量交换位置可以直接用等于号,两边替换变量的位置就可以了,然后计算耗时的时候直接可以用time包的Since直接计算差值。
总结
查看耗时发现一共有10W和元素的数组进行冒泡排序,C++的效率明显比Golang的要慢一半,同样的都是编译型语言差异竟然如此之大,而且Goalng也对比C++较为简洁,又进一步激发了我对Golang的兴趣,后面要仔细研究研究为什么golang这么快。