本代码片段对7个内排序算法作出实现与比较,复制粘贴代码即可编译运行
其中,最需要一定掌握的是快速排序,请一定要记得快速排序的代码shi'xi
/************************
内排序算法的实验比较
使用C++语言分别实现插入排序、冒泡排序、选择排序、归并排序、快速排序、堆排序、基数排序算法,要求:
1)使用随机数生成方法,分别产生规模为100、1000、10000的三组自然数序列,作为各排序算法的输入;
2)算法的实现要求是稳定的(stable);
3)分别以三组自然数序列作为输入,执行各排序算法。要求每组序列各执行三次,记录各算法每次执行时间(毫秒),取平均值作为结果记入实验报告的表1中;
4)根据表1中的结果数据,通过折线图(横坐标表示输入规模,纵坐标表示平均执行时间)来对各算法的时间效率进行比较分析,回答如下问题:
–各组输入中那个排序算法时间开销最小?
随着输入规模的增长,哪个排序算法的增长趋势最缓慢?
*************************/
#include "stdafx.h"
#include<iostream>
#include<vector>
#include<stdio.h>
#include<stdlib.h>
#include<ctime>
#include<iomanip>
#define random(x) (rand()%x)
using namespace std;
//1.插入排序
//平均时间复杂度:O(N^2)
//最坏情况复杂度:O(N^2)
//最好情况复杂度:O(N)
//空间复杂度:O(1)
//最多需要n(n−1)/2次比较
//最少需要n−1次比较
//稳定排序
void insertsort(vector<int>& a)
{
int n = a.size();
for (int i = 1; i < n; i++)
{
int insert_num = a[i], j;
for (j = i - 1; j >= 0; j--)
{
if (a[j] > insert_num)
a[j + 1] = a[j];
else
break;
}
a[j + 1] = insert_num;
}
}
//2.冒泡排序
//平均时间复杂度:O(N^2)
//最坏情况复杂度:O(N^2)
//空间复杂度:O(1)
//稳定排序
void bubblesort(vector<int>& a)
{
int n = a.size();
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n - 1 - i; j++)
{
if (a[j] > a[j + 1])
swap(a[j], a[j + 1]);
}
}
}
//3.选择排序
//平均时间复杂度 O(n^2)
//最坏时间复杂度 O(n^2)
//最好时间复杂度 O(n^2)
//空间复杂度 O(1)
//我这个写法 是稳定排序
void select_sort(vector<int>& vt)
{
for (int i = 0; i < vt.size() - 1; i++)
{
int swap_pos = i;
for (int j = i + 1; j < vt.size(); j++)
{
if (vt[swap_pos] > vt[j])
{
swap_pos = j;
}
}
if (swap_pos != i)
{
swap(vt[swap_pos], vt[i]);
}
}
}
//4.归并排序
//平均时间复杂度:O(NlogN)
//稳定排序
vector<int> mergeHelper(vector<int> &a, int left, int right)
{
if (left == right) return vector<int>(1, a[left]);
int mid = (right - left) / 2