分别实现直接插入排序、希尔排序、冒泡排序、快速排序算法; 测试数据:随机生成5组整数数据,长度1000; 要求:各个算法运行5次以上,求取平均排序时长,进行排序时长对比;用C++写
时间: 2024-03-07 19:46:53 浏览: 200
好的,我会为您介绍这四种排序算法的实现,并为您提供 C++ 代码。以下是每种算法的介绍和实现:
1. 直接插入排序
直接插入排序是一种简单的排序算法,它的基本思想是将一个待排序的数列分成已排序和未排序两部分,每次从未排序的部分中取出一个元素插入到已排序的部分中,直到全部元素都有序排列。
C++ 代码实现:
```cpp
void insertionSort(int arr[], int n){
int i, key, j;
for (i = 1; i < n; i++){
key = arr[i];
j = i - 1;
while (j >= 0 && arr[j] > key){
arr[j + 1] = arr[j];
j = j - 1;
}
arr[j + 1] = key;
}
}
```
2. 希尔排序
希尔排序是一种改进的插入排序,它通过将待排序的数列分成几个子序列来进行排序,每个子序列都采用插入排序进行排序,不过子序列的选择是有一定规律的,这样可以使得整个数列在排序过程中逐渐变得有序。
C++ 代码实现:
```cpp
void shellSort(int arr[], int n){
for (int gap = n/2; gap > 0; gap /= 2){
for (int i = gap; i < n; i += 1){
int temp = arr[i];
int j;
for (j = i; j >= gap && arr[j - gap] > temp; j -= gap)
arr[j] = arr[j - gap];
arr[j] = temp;
}
}
}
```
3. 冒泡排序
冒泡排序是一种简单的排序算法,它通过不断地比较相邻的两个元素并交换位置来进行排序,每次排序将待排序的数列中最大的元素移动到数列的末尾。
C++ 代码实现:
```cpp
void bubbleSort(int arr[], int n){
int i, j;
for (i = 0; i < n-1; i++){
for (j = 0; j < n-i-1; j++){
if (arr[j] > arr[j+1]){
swap(arr[j], arr[j+1]);
}
}
}
}
```
4. 快速排序
快速排序是一种高效的排序算法,它通过选择一个基准元素,将待排序的数列分成两部分,一部分小于基准元素,另一部分大于基准元素,然后对这两部分分别进行快速排序,直到整个数列有序排列。
C++ 代码实现:
```cpp
int partition(int arr[], int low, int high){
int pivot = arr[high];
int i = (low - 1);
for (int j = low; j <= high - 1; j++){
if (arr[j] < pivot){
i++;
swap(arr[i], arr[j]);
}
}
swap(arr[i + 1], arr[high]);
return (i + 1);
}
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);
}
}
```
接下来是测试代码,其中对每种算法运行 5 次,然后计算平均运行时间:
```cpp
#include <iostream>
#include <chrono>
#include <random>
using namespace std;
// 生成随机数
void generateRandom(int arr[], int n){
random_device rd;
mt19937 eng(rd());
uniform_int_distribution<> range(0, 10000);
for (int i = 0; i < n; i++){
arr[i] = range(eng);
}
}
int main(){
int n = 1000;
int arr[n];
// 直接插入排序
double avgTime = 0;
for (int i = 0; i < 5; i++){
generateRandom(arr, n);
auto start = chrono::steady_clock::now();
insertionSort(arr, n);
auto end = chrono::steady_clock::now();
auto diff = end - start;
avgTime += chrono::duration <double, milli> (diff).count();
}
avgTime /= 5;
cout << "直接插入排序的平均时间为:" << avgTime << "ms" << endl;
// 希尔排序
avgTime = 0;
for (int i = 0; i < 5; i++){
generateRandom(arr, n);
auto start = chrono::steady_clock::now();
shellSort(arr, n);
auto end = chrono::steady_clock::now();
auto diff = end - start;
avgTime += chrono::duration <double, milli> (diff).count();
}
avgTime /= 5;
cout << "希尔排序的平均时间为:" << avgTime << "ms" << endl;
// 冒泡排序
avgTime = 0;
for (int i = 0; i < 5; i++){
generateRandom(arr, n);
auto start = chrono::steady_clock::now();
bubbleSort(arr, n);
auto end = chrono::steady_clock::now();
auto diff = end - start;
avgTime += chrono::duration <double, milli> (diff).count();
}
avgTime /= 5;
cout << "冒泡排序的平均时间为:" << avgTime << "ms" << endl;
// 快速排序
avgTime = 0;
for (int i = 0; i < 5; i++){
generateRandom(arr, n);
auto start = chrono::steady_clock::now();
quickSort(arr, 0, n-1);
auto end = chrono::steady_clock::now();
auto diff = end - start;
avgTime += chrono::duration <double, milli> (diff).count();
}
avgTime /= 5;
cout << "快速排序的平均时间为:" << avgTime << "ms" << endl;
return 0;
}
```
希望这份代码能够满足您的需求!
阅读全文