从零开始学习C++(十二.冒泡排序与Golang的效率对比)

610 阅读3分钟

「这是我参与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] << " ";
	}
}


image.png 随机前都打印了前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个元素
}

image.png Golang看起来就比C++简化很多,素组可以用切片的方式访问,也不用随机种子,使用math/rand包就能快速生成随机数,然后变量交换位置可以直接用等于号,两边替换变量的位置就可以了,然后计算耗时的时候直接可以用time包的Since直接计算差值。

总结

查看耗时发现一共有10W和元素的数组进行冒泡排序,C++的效率明显比Golang的要慢一半,同样的都是编译型语言差异竟然如此之大,而且Goalng也对比C++较为简洁,又进一步激发了我对Golang的兴趣,后面要仔细研究研究为什么golang这么快。