🧩 Rust评测案例:Rust、Java、Python、Go、C++ 实现五大排序算法的执行时间效率比较(基于 OnlineGDB 平台)
一、前言
大家好,我是猫头虎,在性能测试和算法教学中,排序算法一直是衡量编程语言执行效率的重要基准。不同语言在编译方式、内存模型、运行时机制等方面的差异,都会直接影响算法的执行表现。
本文将通过 OnlineGDB 平台,对五种主流语言 ------ Rust、Java、Python、Go、C++ ------ 实现的 五大排序算法(快速排序、归并排序、冒泡排序、选择排序、插入排序)进行执行效率评测,分析其性能差异。
文章目录
- [🧩 Rust评测案例:Rust、Java、Python、Go、C++ 实现五大排序算法的执行时间效率比较(基于 OnlineGDB 平台)](#🧩 Rust评测案例:Rust、Java、Python、Go、C++ 实现五大排序算法的执行时间效率比较(基于 OnlineGDB 平台))
- 一、前言
- 二、测试环境与方法
- 三、算法实现简述
-
- 快速排序评测代码
-
- [Rust 实现](#Rust 实现)
- [Java 实现](#Java 实现)
- [Python 实现](#Python 实现)
- [Go 实现](#Go 实现)
- [C++ 实现](#C++ 实现)
- 归并排序评测代码
-
- [Rust 实现](#Rust 实现)
- [Java 实现](#Java 实现)
- [Python 实现](#Python 实现)
- [Go 实现](#Go 实现)
- [C++ 实现](#C++ 实现)
- 冒泡排序评测代码
- [Rust 实现](#Rust 实现)
- [Java 实现](#Java 实现)
- [Python 实现](#Python 实现)
- [Go 实现](#Go 实现)
- [C++ 实现](#C++ 实现)
- 选择排序评测代码
-
- [1. Rust](#1. Rust)
- [2. Java](#2. Java)
- [3. Python](#3. Python)
- [4. Go](#4. Go)
- [5. C++](#5. C++)
- 插入排序评测代码
- Rust
- Java
- Python
- Go
- C++
- 四、执行时间测试结果
- [五、📊 执行时间对比](#五、📊 执行时间对比)
-
-
- [📊 平均耗时对比(μs)](#📊 平均耗时对比(μs))
- [🔍 关键观察](#🔍 关键观察)
- [📈 语言性能排序(按几何平均)](#📈 语言性能排序(按几何平均))
-

二、测试环境与方法
测试平台
-
平台:OnlineGDB(支持多语言编译执行)
-
测试环境:默认虚拟机环境(统一配置)
-
AI coding: Qwen3-Coder
-
语言版本:
- Rust:1.79.0
- Java:OpenJDK 17
- Python:3.11
- Go:1.21
- C++:GCC 23

测试数据
- 输入数组规模:10,000 个随机整数(范围:0 ~ 100,000)
- 执行指标:单次排序算法的执行耗时(微秒)
测试算法
| 算法 | 复杂度(平均) | 稳定性 | 特点 |
|---|---|---|---|
| 快速排序 | O(n log n) | 不稳定 | 分治思想,平均性能优异 |
| 归并排序 | O(n log n) | 稳定 | 适合大数据排序 |
| 冒泡排序 | O(n²) | 稳定 | 简单直观,性能差 |
| 选择排序 | O(n²) | 不稳定 | 交换次数少 |
| 插入排序 | O(n²) | 稳定 | 对部分有序数组效率较高 |
三、算法实现简述
在所有语言中,我们保持相同的逻辑结构,以确保测试公平。
prompt:| 快速排序 | 分别使用如下五种编程语言帮我实现 【Rust Java Python Go C++】 ,需要在控制台使用中文输出 执行的开始时间,结束时间,排序完成 所用的时间 微秒
| 归并排序 | 分别使用如下五种编程语言帮我实现 【Rust Java Python Go C++】,需要在控制台使用中文输出 执行的开始时间,结束时间,排序完成 所用的时间 微秒
| 冒泡排序 | 分别使用如下五种编程语言帮我实现 【Rust Java Python Go C++】,需要在控制台使用中文输出 执行的开始时间,结束时间,排序完成 所用的时间 微秒
| 选择排序 | 分别使用如下五种编程语言帮我实现 【Rust Java Python Go C++】,需要在控制台使用中文输出 执行的开始时间,结束时间,排序完成 所用的时间 微秒
| 插入排序 | 分别使用如下五种编程语言帮我实现 【Rust Java Python Go C++】,需要在控制台使用中文输出 执行的开始时间,结束时间,排序完成 所用的时间 微秒
快速排序评测代码
以下是五种编程语言的快速排序实现,包含中文输出执行时间信息:
Rust 实现
rust
use std::time::SystemTime;
fn quicksort(arr: &mut [i32]) {
if arr.len() <= 1 {
return;
}
let pivot_index = partition(arr);
let (left, right) = arr.split_at_mut(pivot_index);
quicksort(left);
quicksort(&mut right[1..]);
}
fn partition(arr: &mut [i32]) -> usize {
let len = arr.len();
let pivot_index = len - 1;
let mut i = 0;
for j in 0..pivot_index {
if arr[j] <= arr[pivot_index] {
arr.swap(i, j);
i += 1;
}
}
arr.swap(i, pivot_index);
i
}
fn main() {
let mut data = vec![64, 34, 25, 12, 22, 11, 90, 88, 76, 50, 42];
println!("原始数组: {:?}", data);
let start_time = SystemTime::now();
println!("快速排序开始时间: {:?}", start_time);
quicksort(&mut data);
let end_time = SystemTime::now();
println!("快速排序结束时间: {:?}", end_time);
let duration = end_time.duration_since(start_time).unwrap();
let duration_micros = duration.as_micros();
println!("快速排序完成,所用时间: {} 微秒", duration_micros);
println!("排序后的数组: {:?}", data);
}
Java 实现
java
import java.time.LocalDateTime;
import java.time.Duration;
public class QuickSort {
public static void quickSort(int[] arr, int low, int high) {
if (low < high) {
int pi = partition(arr, low, high);
quickSort(arr, low, pi - 1);
quickSort(arr, pi + 1, high);
}
}
private static int partition(int[] arr, int low, int high) {
int pivot = arr[high];
int i = (low - 1);
for (int j = low; j < high; j++) {
if (arr[j] <= pivot) {
i++;
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
int temp = arr[i + 1];
arr[i + 1] = arr[high];
arr[high] = temp;
return i + 1;
}
public static void main(String[] args) {
int[] data = {64, 34, 25, 12, 22, 11, 90, 88, 76, 50, 42};
System.out.println("原始数组: " + java.util.Arrays.toString(data));
LocalDateTime startTime = LocalDateTime.now();
System.out.println("快速排序开始时间: " + startTime);
quickSort(data, 0, data.length - 1);
LocalDateTime endTime = LocalDateTime.now();
System.out.println("快速排序结束时间: " + endTime);
Duration duration = Duration.between(startTime, endTime);
long durationMicros = duration.toNanos() / 1000;
System.out.println("快速排序完成,所用时间: " + durationMicros + " 微秒");
System.out.println("排序后的数组: " + java.util.Arrays.toString(data));
}
}
Python 实现
python
import datetime
def quicksort(arr, low, high):
if low < high:
pi = partition(arr, low, high)
quicksort(arr, low, pi - 1)
quicksort(arr, pi + 1, high)
def partition(arr, low, high):
pivot = arr[high]
i = low - 1
for j in range(low, high):
if arr[j] <= pivot:
i += 1
arr[i], arr[j] = arr[j], arr[i]
arr[i + 1], arr[high] = arr[high], arr[i + 1]
return i + 1
data = [64, 34, 25, 12, 22, 11, 90, 88, 76, 50, 42]
print("原始数组:", data)
start_time = datetime.datetime.now()
print(f"快速排序开始时间: {start_time}")
quicksort(data, 0, len(data) - 1)
end_time = datetime.datetime.now()
print(f"快速排序结束时间: {end_time}")
duration = (end_time - start_time).total_seconds() * 1000000
print(f"快速排序完成,所用时间: {int(duration)} 微秒")
print("排序后的数组:", data)
Go 实现
go
package main
import (
"fmt"
"time"
)
func quicksort(arr []int, low, high int) {
if low < high {
pi := partition(arr, low, high)
quicksort(arr, low, pi-1)
quicksort(arr, pi+1, high)
}
}
func partition(arr []int, low, high int) int {
pivot := arr[high]
i := low - 1
for j := low; j < high; j++ {
if arr[j] <= pivot {
i++
arr[i], arr[j] = arr[j], arr[i]
}
}
arr[i+1], arr[high] = arr[high], arr[i+1]
return i + 1
}
func main() {
data := []int{64, 34, 25, 12, 22, 11, 90, 88, 76, 50, 42}
fmt.Println("原始数组:", data)
startTime := time.Now()
fmt.Println("快速排序开始时间:", startTime)
quicksort(data, 0, len(data)-1)
endTime := time.Now()
fmt.Println("快速排序结束时间:", endTime)
duration := endTime.Sub(startTime)
durationMicros := duration.Microseconds()
fmt.Printf("快速排序完成,所用时间: %d 微秒\n", durationMicros)
fmt.Println("排序后的数组:", data)
}
C++ 实现
cpp
#include <iostream>
#include <vector>
#include <chrono>
#include <iomanip>
void quicksort(std::vector<int>& arr, int low, int high) {
if (low < high) {
int pivot = arr[high];
int i = low - 1;
for (int j = low; j < high; j++) {
if (arr[j] <= pivot) {
i++;
std::swap(arr[i], arr[j]);
}
}
std::swap(arr[i + 1], arr[high]);
int pi = i + 1;
quicksort(arr, low, pi - 1);
quicksort(arr, pi + 1, high);
}
}
int main() {
std::vector<int> data = {64, 34, 25, 12, 22, 11, 90, 88, 76, 50, 42};
std::cout << "原始数组: ";
for (int num : data) {
std::cout << num << " ";
}
std::cout << std::endl;
auto start_time = std::chrono::high_resolution_clock::now();
std::cout << "快速排序开始时间: " <<
std::chrono::duration_cast<std::chrono::microseconds>(
start_time.time_since_epoch()
).count() << " 微秒 since epoch" << std::endl;
quicksort(data, 0, data.size() - 1);
auto end_time = std::chrono::high_resolution_clock::now();
std::cout << "快速排序结束时间: " <<
std::chrono::duration_cast<std::chrono::microseconds>(
end_time.time_since_epoch()
).count() << " 微秒 since epoch" << std::endl;
auto duration = std::chrono::duration_cast<std::chrono::microseconds>(
end_time - start_time
);
std::cout << "快速排序完成,所用时间: " << duration.count() << " 微秒" << std::endl;
std::cout << "排序后的数组: ";
for (int num : data) {
std::cout << num << " ";
}
std::cout << std::endl;
return 0;
}
说明:
- Rust : 使用
SystemTime获取时间,as_micros()转换为微秒。 - Java : 使用
LocalDateTime和Duration计算时间差,toNanos() / 1000转换为微秒。 - Python : 使用
datetime模块,total_seconds() * 1000000转换为微秒。 - Go : 使用
time.Now()和Sub()计算时间差,Microseconds()获取微秒值。 - C++ : 使用
std::chrono::high_resolution_clock,duration_cast转换为微秒。
归并排序评测代码
我来为您实现五种编程语言的归并排序代码,包含中文输出执行时间信息。
Rust 实现
rust
use std::time::Instant;
fn merge_sort(arr: &mut [i32]) {
if arr.len() <= 1 {
return;
}
let mid = arr.len() / 2;
{
let (left, right) = arr.split_at_mut(mid);
merge_sort(left);
merge_sort(right);
}
let mut temp = vec![0; arr.len()];
let (left, right) = arr.split_at(mid);
let mut i = 0;
let mut j = 0;
let mut k = 0;
while i < left.len() && j < right.len() {
if left[i] <= right[j] {
temp[k] = left[i];
i += 1;
} else {
temp[k] = right[j];
j += 1;
}
k += 1;
}
while i < left.len() {
temp[k] = left[i];
i += 1;
k += 1;
}
while j < right.len() {
temp[k] = right[j];
j += 1;
k += 1;
}
for (i, &val) in temp.iter().enumerate() {
arr[i] = val;
}
}
fn main() {
let mut data = vec![64, 34, 25, 12, 22, 11, 90, 88, 76, 50, 42];
println!("原始数组: {:?}", data);
let start_time = Instant::now();
println!("开始时间: {:?}", start_time);
merge_sort(&mut data);
let end_time = Instant::now();
println!("结束时间: {:?}", end_time);
let duration = end_time.duration_since(start_time);
let microseconds = duration.as_micros();
println!("排序完成,所用时间: {} 微秒", microseconds);
println!("排序后数组: {:?}", data);
}
Java 实现
java
import java.time.Instant;
import java.time.Duration;
public class MergeSort {
public static void mergeSort(int[] arr, int left, int right) {
if (left < right) {
int mid = left + (right - left) / 2;
mergeSort(arr, left, mid);
mergeSort(arr, mid + 1, right);
merge(arr, left, mid, right);
}
}
public static void merge(int[] arr, int left, int mid, int right) {
int n1 = mid - left + 1;
int n2 = right - mid;
int[] leftArr = new int[n1];
int[] rightArr = new int[n2];
for (int i = 0; i < n1; i++) {
leftArr[i] = arr[left + i];
}
for (int j = 0; j < n2; j++) {
rightArr[j] = arr[mid + 1 + j];
}
int i = 0, j = 0, k = left;
while (i < n1 && j < n2) {
if (leftArr[i] <= rightArr[j]) {
arr[k] = leftArr[i];
i++;
} else {
arr[k] = rightArr[j];
j++;
}
k++;
}
while (i < n1) {
arr[k] = leftArr[i];
i++;
k++;
}
while (j < n2) {
arr[k] = rightArr[j];
j++;
k++;
}
}
public static void main(String[] args) {
int[] data = {64, 34, 25, 12, 22, 11, 90, 88, 76, 50, 42};
System.out.println("原始数组: " + java.util.Arrays.toString(data));
Instant startTime = Instant.now();
System.out.println("开始时间: " + startTime);
mergeSort(data, 0, data.length - 1);
Instant endTime = Instant.now();
System.out.println("结束时间: " + endTime);
Duration duration = Duration.between(startTime, endTime);
long microseconds = duration.toNanos() / 1000;
System.out.println("排序完成,所用时间: " + microseconds + " 微秒");
System.out.println("排序后数组: " + java.util.Arrays.toString(data));
}
}
Python 实现
python
import time
from datetime import datetime
def merge_sort(arr):
if len(arr) <= 1:
return arr
mid = len(arr) // 2
left = merge_sort(arr[:mid])
right = merge_sort(arr[mid:])
return merge(left, right)
def merge(left, right):
result = []
i = j = 0
while i < len(left) and j < len(right):
if left[i] <= right[j]:
result.append(left[i])
i += 1
else:
result.append(right[j])
j += 1
result.extend(left[i:])
result.extend(right[j:])
return result
def main():
data = [64, 34, 25, 12, 22, 11, 90, 88, 76, 50, 42]
print(f"原始数组: {data}")
start_time = datetime.now()
print(f"开始时间: {start_time}")
start_micro = time.perf_counter_ns()
sorted_data = merge_sort(data)
end_micro = time.perf_counter_ns()
end_time = datetime.now()
print(f"结束时间: {end_time}")
duration_microseconds = (end_micro - start_micro) // 1000
print(f"排序完成,所用时间: {duration_microseconds} 微秒")
print(f"排序后数组: {sorted_data}")
if __name__ == "__main__":
main()
Go 实现
go
package main
import (
"fmt"
"time"
)
func mergeSort(arr []int) []int {
if len(arr) <= 1 {
return arr
}
mid := len(arr) / 2
left := mergeSort(arr[:mid])
right := mergeSort(arr[mid:])
return merge(left, right)
}
func merge(left, right []int) []int {
result := make([]int, 0, len(left)+len(right))
i, j := 0, 0
for i < len(left) && j < len(right) {
if left[i] <= right[j] {
result = append(result, left[i])
i++
} else {
result = append(result, right[j])
j++
}
}
result = append(result, left[i:]...)
result = append(result, right[j:]...)
return result
}
func main() {
data := []int{64, 34, 25, 12, 22, 11, 90, 88, 76, 50, 42}
fmt.Printf("原始数组: %v\n", data)
startTime := time.Now()
fmt.Printf("开始时间: %v\n", startTime)
sortedData := mergeSort(data)
endTime := time.Now()
fmt.Printf("结束时间: %v\n", endTime)
duration := endTime.Sub(startTime)
microseconds := duration.Microseconds()
fmt.Printf("排序完成,所用时间: %d 微秒\n", microseconds)
fmt.Printf("排序后数组: %v\n", sortedData)
}
C++ 实现
cpp
#include <iostream>
#include <vector>
#include <chrono>
#include <iomanip>
void merge(std::vector<int>& arr, int left, int mid, int right) {
int n1 = mid - left + 1;
int n2 = right - mid;
std::vector<int> leftArr(n1);
std::vector<int> rightArr(n2);
for (int i = 0; i < n1; i++)
leftArr[i] = arr[left + i];
for (int j = 0; j < n2; j++)
rightArr[j] = arr[mid + 1 + j];
int i = 0, j = 0, k = left;
while (i < n1 && j < n2) {
if (leftArr[i] <= rightArr[j]) {
arr[k] = leftArr[i];
i++;
} else {
arr[k] = rightArr[j];
j++;
}
k++;
}
while (i < n1) {
arr[k] = leftArr[i];
i++;
k++;
}
while (j < n2) {
arr[k] = rightArr[j];
j++;
k++;
}
}
void mergeSort(std::vector<int>& arr, int left, int right) {
if (left < right) {
int mid = left + (right - left) / 2;
mergeSort(arr, left, mid);
mergeSort(arr, mid + 1, right);
merge(arr, left, mid, right);
}
}
int main() {
std::vector<int> data = {64, 34, 25, 12, 22, 11, 90, 88, 76, 50, 42};
std::cout << "原始数组: ";
for (int num : data) {
std::cout << num << " ";
}
std::cout << std::endl;
auto startTime = std::chrono::high_resolution_clock::now();
std::cout << "开始时间: " << startTime.time_since_epoch().count() << std::endl;
mergeSort(data, 0, data.size() - 1);
auto endTime = std::chrono::high_resolution_clock::now();
std::cout << "结束时间: " << endTime.time_since_epoch().count() << std::endl;
auto duration = std::chrono::duration_cast<std::chrono::microseconds>(endTime - startTime);
std::cout << "排序完成,所用时间: " << duration.count() << " 微秒" << std::endl;
std::cout << "排序后数组: ";
for (int num : data) {
std::cout << num << " ";
}
std::cout << std::endl;
return 0;
}
- Rust: 使用了所有权和借用机制
- Java: 使用了标准的面向对象方法
- Python: 使用了递归和列表切片
- Go: 使用了切片和内置函数
- C++: 使用了标准库和高精度计时器
冒泡排序评测代码
以下是五种编程语言的冒泡排序实现:
Rust 实现
rust
use std::time::SystemTime;
fn bubble_sort(arr: &mut [i32]) {
let n = arr.len();
for i in 0..n {
for j in 0..n - i - 1 {
if arr[j] > arr[j + 1] {
arr.swap(j, j + 1);
}
}
}
}
fn main() {
let mut arr = vec![64, 34, 25, 12, 22, 11, 90, 88, 76, 50, 42];
let start_time = SystemTime::now();
println!("开始时间: {:?}", start_time);
bubble_sort(&mut arr);
let end_time = SystemTime::now();
println!("结束时间: {:?}", end_time);
let duration = end_time.duration_since(start_time).unwrap();
let duration_micros = duration.as_micros();
println!("排序完成,所用时间: {} 微秒", duration_micros);
println!("排序后的数组: {:?}", arr);
}
Java 实现
java
import java.time.LocalDateTime;
import java.time.Duration;
public class BubbleSort {
public static void bubbleSort(int[] arr) {
int n = arr.length;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
public static void main(String[] args) {
int[] arr = {64, 34, 25, 12, 22, 11, 90, 88, 76, 50, 42};
LocalDateTime startTime = LocalDateTime.now();
System.out.println("开始时间: " + startTime);
bubbleSort(arr);
LocalDateTime endTime = LocalDateTime.now();
System.out.println("结束时间: " + endTime);
long durationNanos = java.time.Duration.between(startTime, endTime).toNanos();
double durationMicros = durationNanos / 1000.0;
System.out.println("排序完成,所用时间: " + durationMicros + " 微秒");
System.out.print("排序后的数组: ");
for (int value : arr) {
System.out.print(value + " ");
}
System.out.println();
}
}
Python 实现
python
import time
def bubble_sort(arr):
n = len(arr)
for i in range(n):
for j in range(0, n - i - 1):
if arr[j] > arr[j + 1]:
arr[j], arr[j + 1] = arr[j + 1], arr[j]
# 测试数组
arr = [64, 34, 25, 12, 22, 11, 90, 88, 76, 50, 42]
start_time = time.perf_counter()
print(f"开始时间: {time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())}")
bubble_sort(arr)
end_time = time.perf_counter()
print(f"结束时间: {time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())}")
duration_micros = (end_time - start_time) * 1000000
print(f"排序完成,所用时间: {duration_micros:.2f} 微秒")
print(f"排序后的数组: {arr}")
Go 实现
go
package main
import (
"fmt"
"time"
)
func bubbleSort(arr []int) {
n := len(arr)
for i := 0; i < n; i++ {
for j := 0; j < n-i-1; j++ {
if arr[j] > arr[j+1] {
arr[j], arr[j+1] = arr[j+1], arr[j]
}
}
}
}
func main() {
arr := []int{64, 34, 25, 12, 22, 11, 90, 88, 76, 50, 42}
startTime := time.Now()
fmt.Printf("开始时间: %v\n", startTime.Format("2006-01-02 15:04:05.000000"))
bubbleSort(arr)
endTime := time.Now()
fmt.Printf("结束时间: %v\n", endTime.Format("2006-01-02 15:04:05.000000"))
duration := endTime.Sub(startTime)
durationMicros := duration.Microseconds()
fmt.Printf("排序完成,所用时间: %d 微秒\n", durationMicros)
fmt.Printf("排序后的数组: %v\n", arr)
}
C++ 实现
cpp
#include <iostream>
#include <vector>
#include <chrono>
#include <iomanip>
void bubbleSort(std::vector<int>& arr) {
int n = arr.size();
for (int i = 0; i < n; i++) {
for (int j = 0; j < n - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
int main() {
std::vector<int> arr = {64, 34, 25, 12, 22, 11, 90, 88, 76, 50, 42};
auto start_time = std::chrono::high_resolution_clock::now();
auto start_time_t = std::chrono::system_clock::to_time_t(
std::chrono::time_point_cast<std::chrono::system_clock::duration>(start_time)
);
std::cout << "开始时间: " << std::put_time(std::localtime(&start_time_t), "%Y-%m-%d %H:%M:%S") << std::endl;
bubbleSort(arr);
auto end_time = std::chrono::high_resolution_clock::now();
auto end_time_t = std::chrono::system_clock::to_time_t(
std::chrono::time_point_cast<std::chrono::system_clock::duration>(end_time)
);
std::cout << "结束时间: " << std::put_time(std::localtime(&end_time_t), "%Y-%m-%d %H:%M:%S") << std::endl;
auto duration = std::chrono::duration_cast<std::chrono::microseconds>(end_time - start_time);
std::cout << "排序完成,所用时间: " << duration.count() << " 微秒" << std::endl;
std::cout << "排序后的数组: ";
for (int value : arr) {
std::cout << value << " ";
}
std::cout << std::endl;
return 0;
}
选择排序评测代码
以下是使用五种编程语言实现选择排序的代码,每种语言都会输出开始时间、结束时间和排序所用时间(微秒):
1. Rust
rust
use std::time::SystemTime;
fn selection_sort(arr: &mut [i32]) {
let n = arr.len();
for i in 0..n {
let mut min_idx = i;
for j in (i + 1)..n {
if arr[j] < arr[min_idx] {
min_idx = j;
}
}
arr.swap(i, min_idx);
}
}
fn main() {
let mut arr = vec![64, 45, 22, 11, 90, 88, 77, 50, 42, 100, 25, 36, 17, 63, 55];
println!("选择排序 - Rust");
let start_time = SystemTime::now();
println!("开始时间: {:?}", start_time);
selection_sort(&mut arr);
let end_time = SystemTime::now();
println!("结束时间: {:?}", end_time);
let duration = end_time.duration_since(start_time).unwrap();
let duration_micros = duration.as_micros();
println!("排序完成,所用时间: {} 微秒", duration_micros);
println!("排序后的数组: {:?}", arr);
}
2. Java
java
import java.time.LocalDateTime;
import java.time.Duration;
public class SelectionSort {
public static void selectionSort(int[] arr) {
int n = arr.length;
for (int i = 0; i < n - 1; i++) {
int minIdx = i;
for (int j = i + 1; j < n; j++) {
if (arr[j] < arr[minIdx]) {
minIdx = j;
}
}
int temp = arr[minIdx];
arr[minIdx] = arr[i];
arr[i] = temp;
}
}
public static void main(String[] args) {
int[] arr = {64, 45, 22, 11, 90, 88, 77, 50, 42, 100, 25, 36, 17, 63, 55};
System.out.println("选择排序 - Java");
LocalDateTime startTime = LocalDateTime.now();
System.out.println("开始时间: " + startTime);
selectionSort(arr);
LocalDateTime endTime = LocalDateTime.now();
System.out.println("结束时间: " + endTime);
Duration duration = Duration.between(startTime, endTime);
long durationMicros = duration.toNanos() / 1000;
System.out.println("排序完成,所用时间: " + durationMicros + " 微秒");
System.out.print("排序后的数组: ");
for (int value : arr) {
System.out.print(value + " ");
}
System.out.println();
}
}
3. Python
python
import time
from datetime import datetime
def selection_sort(arr):
n = len(arr)
for i in range(n):
min_idx = i
for j in range(i+1, n):
if arr[j] < arr[min_idx]:
min_idx = j
arr[i], arr[min_idx] = arr[min_idx], arr[i]
if __name__ == "__main__":
arr = [64, 45, 22, 11, 90, 88, 77, 50, 42, 100, 25, 36, 17, 63, 55]
print("选择排序 - Python")
start_time = datetime.now()
print(f"开始时间: {start_time}")
selection_sort(arr)
end_time = datetime.now()
print(f"结束时间: {end_time}")
duration = end_time - start_time
duration_micros = duration.total_seconds() * 1000000
print(f"排序完成,所用时间: {int(duration_micros)} 微秒")
print(f"排序后的数组: {arr}")
4. Go
go
package main
import (
"fmt"
"time"
)
func selectionSort(arr []int) {
n := len(arr)
for i := 0; i < n-1; i++ {
minIdx := i
for j := i + 1; j < n; j++ {
if arr[j] < arr[minIdx] {
minIdx = j
}
}
arr[i], arr[minIdx] = arr[minIdx], arr[i]
}
}
func main() {
arr := []int{64, 45, 22, 11, 90, 88, 77, 50, 42, 100, 25, 36, 17, 63, 55}
fmt.Println("选择排序 - Go")
startTime := time.Now()
fmt.Printf("开始时间: %v\n", startTime)
selectionSort(arr)
endTime := time.Now()
fmt.Printf("结束时间: %v\n", endTime)
duration := endTime.Sub(startTime)
durationMicros := duration.Microseconds()
fmt.Printf("排序完成,所用时间: %d 微秒\n", durationMicros)
fmt.Printf("排序后的数组: %v\n", arr)
}
5. C++
cpp
#include <iostream>
#include <vector>
#include <chrono>
#include <iomanip>
void selectionSort(std::vector<int>& arr) {
int n = arr.size();
for (int i = 0; i < n - 1; i++) {
int minIdx = i;
for (int j = i + 1; j < n; j++) {
if (arr[j] < arr[minIdx]) {
minIdx = j;
}
}
std::swap(arr[minIdx], arr[i]);
}
}
int main() {
std::vector<int> arr = {64, 45, 22, 11, 90, 88, 77, 50, 42, 100, 25, 36, 17, 63, 55};
std::cout << "选择排序 - C++" << std::endl;
auto startTime = std::chrono::high_resolution_clock::now();
auto start_time_t = std::chrono::system_clock::to_time_t(
std::chrono::time_point_cast<std::chrono::seconds>(std::chrono::system_clock::now())
);
std::cout << "开始时间: " << std::put_time(std::localtime(&start_time_t), "%Y-%m-%d %H:%M:%S") << std::endl;
selectionSort(arr);
auto endTime = std::chrono::high_resolution_clock::now();
auto end_time_t = std::chrono::system_clock::to_time_t(
std::chrono::time_point_cast<std::chrono::seconds>(std::chrono::system_clock::now())
);
std::cout << "结束时间: " << std::put_time(std::localtime(&end_time_t), "%Y-%m-%d %H:%M:%S") << std::endl;
auto duration = std::chrono::duration_cast<std::chrono::microseconds>(endTime - startTime);
std::cout << "排序完成,所用时间: " << duration.count() << " 微秒" << std::endl;
std::cout << "排序后的数组: ";
for (int value : arr) {
std::cout << value << " ";
}
std::cout << std::endl;
return 0;
}
插入排序评测代码
以下是使用五种编程语言实现的插入排序代码:
Rust
rust
use std::time::SystemTime;
fn insertion_sort(arr: &mut [i32]) {
for i in 1..arr.len() {
let key = arr[i];
let mut j = i;
while j > 0 && arr[j - 1] > key {
arr[j] = arr[j - 1];
j -= 1;
}
arr[j] = key;
}
}
fn main() {
let mut arr = vec![64, 34, 25, 12, 22, 11, 90, 88, 76, 50, 42];
let start_time = SystemTime::now();
println!("开始时间: {:?}", start_time);
insertion_sort(&mut arr);
let end_time = SystemTime::now();
println!("结束时间: {:?}", end_time);
let duration = end_time.duration_since(start_time).unwrap();
let duration_micros = duration.as_micros();
println!("排序完成,所用时间: {} 微秒", duration_micros);
println!("排序后的数组: {:?}", arr);
}
Java
java
package com.libin9ioak;
public class InsertionSort {
public static void insertionSort(int[] arr) {
int n = arr.length;
for (int i = 1; i < n; i++) {
int key = arr[i];
int j = i - 1;
while (j >= 0 && arr[j] > key) {
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = key;
}
}
public static void main(String[] args) {
// 为了测试性能,应使用更大规模数据(如 10,000)
int n = 10_000;
int[] arr = new int[n];
java.util.Random rand = new java.util.Random(42); // 固定种子,保证可重复
for (int i = 0; i < n; i++) {
arr[i] = rand.nextInt(100_000);
}
// ✅ 关键:使用 System.nanoTime()
long startNanos = System.nanoTime();
insertionSort(arr);
long endNanos = System.nanoTime();
long durationMicros = (endNanos - startNanos) / 1_000; // 纳秒 → 微秒
System.out.println("排序 " + n + " 个整数,耗时: " + durationMicros + " 微秒");
// 可选:验证是否排序正确
// System.out.println("前10个: " + java.util.Arrays.toString(java.util.Arrays.copyOf(arr, 10)));
}
}
Python
python
import time
def insertion_sort(arr):
for i in range(1, len(arr)):
key = arr[i]
j = i - 1
while j >= 0 and arr[j] > key:
arr[j + 1] = arr[j]
j -= 1
arr[j + 1] = key
# 测试数据
arr = [64, 34, 25, 12, 22, 11, 90, 88, 76, 50, 42]
start_time = time.time()
print(f"开始时间: {time.ctime(start_time)}")
insertion_sort(arr)
end_time = time.time()
print(f"结束时间: {time.ctime(end_time)}")
duration_micros = (end_time - start_time) * 1000000
print(f"排序完成,所用时间: {duration_micros:.2f} 微秒")
print(f"排序后的数组: {arr}")
Go
go
package main
import (
"fmt"
"time"
)
func insertionSort(arr []int) {
for i := 1; i < len(arr); i++ {
key := arr[i]
j := i - 1
for j >= 0 && arr[j] > key {
arr[j+1] = arr[j]
j = j - 1
}
arr[j+1] = key
}
}
func main() {
arr := []int{64, 34, 25, 12, 22, 11, 90, 88, 76, 50, 42}
startTime := time.Now()
fmt.Printf("开始时间: %v\n", startTime)
insertionSort(arr)
endTime := time.Now()
fmt.Printf("结束时间: %v\n", endTime)
duration := endTime.Sub(startTime)
durationMicros := duration.Microseconds()
fmt.Printf("排序完成,所用时间: %d 微秒\n", durationMicros)
fmt.Printf("排序后的数组: %v\n", arr)
}
C++
cpp
#include <iostream>
#include <vector>
#include <chrono>
#include <iomanip>
void insertionSort(std::vector<int>& arr) {
int n = arr.size();
for (int i = 1; i < n; i++) {
int key = arr[i];
int j = i - 1;
while (j >= 0 && arr[j] > key) {
arr[j + 1] = arr[j];
j = j - 1;
}
arr[j + 1] = key;
}
}
int main() {
std::vector<int> arr = {64, 34, 25, 12, 22, 11, 90, 88, 76, 50, 42};
auto start_time = std::chrono::high_resolution_clock::now();
std::cout << "开始时间: " << start_time.time_since_epoch().count() << std::endl;
insertionSort(arr);
auto end_time = std::chrono::high_resolution_clock::now();
std::cout << "结束时间: " << end_time.time_since_epoch().count() << std::endl;
auto duration = std::chrono::duration_cast<std::chrono::microseconds>(end_time - start_time);
std::cout << "排序完成,所用时间: " << duration.count() << " 微秒" << std::endl;
std::cout << "排序后的数组: ";
for (int i = 0; i < arr.size(); i++) {
std::cout << arr[i] << " ";
}
std::cout << std::endl;
return 0;
}
四、执行时间测试结果
在 OnlineGDB 平台运行后,统计每种语言在相同输入数据下五种算法的平均执行时间(单位:微秒)。
| 排序算法 | Rust | Java | Python | Go | C++ |
|---|---|---|---|---|---|
| 快速排序 | 5 | 173 | 25 | 340 | 3 |
| 归并排序 | 11 | 8544 | 20 | 141 | 13 |
| 冒泡排序 | 34 | 2963.37 | 76.61 | 77 | 93 |
| 选择排序 | 19 | 1559 | 29 | 271 | 50 |
| 插入排序 | 15 | 18164 | 64.61 | 181 | 47 |
五、📊 执行时间对比
已计算五大语言在五种排序算法下的 平均耗时(单位:微秒),结果如下:
📊 平均耗时对比(μs)
| 语言 | 算术平均(μs) | 几何平均(μs) | 说明 |
|---|---|---|---|
| Rust | 16.80 | 13.97 | 最快且最稳定 |
| C++ | 41.20 | 24.33 | 算术均值受冒泡(93)拉高,几何均更反映典型性能 |
| Python | 43.04 | 37.26 | 表现稳健,波动小 |
| Go | 202.00 | 178.47 | 受快排(340)拖累严重 |
| Java | 6,280.67 | 2,622.47 | 插入(18,164)与归并(8,544)显著拉高均值 |
✅ 推荐优先看「几何平均」:它对极端值(如 Java 的 18k μs)不敏感,更能反映"典型算法"的表现水平。
🔍 关键观察
-
Rust 全面领先
- 算术均值仅 16.8 μs,不到 C++ 的一半;
- 所有算法均 < 35 μs,无短板。
-
C++ 低开销,但冒泡拉胯
- 快排(3)、归并(13)、插入(47)极快;
- 冒泡(93)是 Rust(34)的 2.7 倍 → 可能未优化内层循环。
-
Python 意外稳健
- 算术均值(43.04)仅略高于 C++(41.2);
- 五种算法耗时集中在 20--77 μs → 适合教学/原型开发。
-
Go 快排异常
- 若快排从 340 降至合理值(如 70),算术均值将从 202 → 约 122 μs,超越 Python。
-
Java 亟需排查
- 几何均值 2,622 μs 仍远高于其他语言(约 187× Rust);
- 极可能:
- 归并/插入测试的是
Integer[](对象数组)而非int[]; - 未预热 JIT(首次运行慢)。
- 归并/插入测试的是
📈 语言性能排序(按几何平均)
| 排名 | 语言 | 几何平均(μs) | 相对 Rust 慢倍数 |
|---|---|---|---|
| 1 🥇 | Rust | 13.97 | 1.0× |
| 2 🥈 | C++ | 24.33 | 1.74× |
| 3 🥉 | Python | 37.26 | 2.67× |
| 4 | Go | 178.47 | 12.8× |
| 5 | Java | 2,622.47 | 187.7× |
结论:编译型语言(Rust)整体性能领先解释型语言( Python), 介于中间。