#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
void Random(int *a,int n,int l,int r)//生成范围在l~r的随机数
{
srand(time(0)); //设置时间种子
for(int i=0;i<n;i++){
a[i]=rand()%(r-l+1)+l;//生成区间r~l的随机数
}
}
void Print(int *a,int n)
{
for(int i=0;i<n;i++)
cout<<a[i]<<" ";
cout<<endl;
}
void select_sort(int array[], int n)
{
int i;
int j;
int tmp;
/* n个数字进行排序,共需要进行n-1轮比较 */
for (i = 0; i < n - 1; i++)
{
/* 每次循环选择未排序列表中的最小值,与array[i]交换 */
for (j = i + 1; j < n; j++)
{
if (array[i] > array[j])
{
tmp = array[i];
array[i] = array[j];
array[j] = tmp;
}
}
}
}
void bubble_sort(int arr[],int n) {
for (int i = 0; i < n-1; i++)
{
for (int j = 0; j < n - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
//左大右小,则交换,保持始终右边最大
int tmp = arr[j];//tmp暂存大值
arr[j] = arr[j+1];
arr[j+1] = tmp;
}
}
}
}
void merge(int* a, int low, int mid, int hight) //合并函数
{
int* b = new int[hight - low + 1]; //用 new 申请一个辅助函数
int i = low, j = mid + 1, k = 0; // k为 b 数组的小标
while (i <= mid && j <= hight)
{
if (a[i] <= a[j])
{
b[k++] = a[i++]; //按从小到大存放在 b 数组里面
}
else
{
b[k++] = a[j++];
}
}
while (i <= mid) // j 序列结束,将剩余的 i 序列补充在 b 数组中
{
b[k++] = a[i++];
}
while (j <= hight)// i 序列结束,将剩余的 j 序列补充在 b 数组中
{
b[k++] = a[j++];
}
k = 0; //从小标为 0 开始传送
for (int i = low; i <= hight; i++) //将 b 数组的值传递给数组 a
{
a[i] = b[k++];
}
delete[]b; // 辅助数组用完后,将其的空间进行释放(销毁)
}
void merge_sort(int* a, int low, int hight) //归并排序
{
if (low < hight)
{
int mid = (low + hight) / 2;
merge_sort(a, low, mid); //对 a[low,mid]进行排序
merge_sort(a, mid + 1, hight); //对 a[mid+1,hight]进行排序
merge(a, low, mid, hight); //进行合并操作
}
}
//快速排序(从小到大)
void quick_sort(int left, int right, int* arr)
{
if(left >= right)
return;
int i, j, base, temp;
i = left, j = right;
base = arr[left]; //取最左边的数为基准数
while (i < j)
{
while (arr[j] >= base && i < j)
j--;
while (arr[i] <= base && i < j)
i++;
if(i < j)
{
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
//基准数归位
arr[left] = arr[i];
arr[i] = base;
quick_sort(left, i - 1, arr);//递归左边
quick_sort(i + 1, right, arr);//递归右边
}
void insert_sort(int arr[], int n) {
for (int i = 1; i < n; i++) {
int temp = arr[i]; //待排序元素
int j = i - 1;
while (j >= 0 && arr[j] > temp) {
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = temp;
}
}
int main()
{
int n;//数组元素的个数,即生成随机数的个数
n=200000;
int *a,*b,*c,*d,*e;
a=new int[n];
b=new int[n];
c=new int[n];
d=new int[n];
e=new int[n];
Random(a,n,1,n);//生成随机数的通常范围为0~32767,这里通过取模控制取值为0~100
for(int i=0;i<n;i++){
b[i]=a[i];
c[i]=a[i];
d[i]=a[i];
e[i]=a[i];
}
clock_t startTime, endTime;
double t1,t2,t3,t4,t5;
//选择排序
startTime=clock();
select_sort(a,200000);
endTime=clock();
t1=(double)(endTime - startTime) / CLOCKS_PER_SEC;
cout<<"选择"<<t1<<endl;
//冒泡排序
startTime=clock();
bubble_sort(b,200000);
endTime=clock();
t2=(double)(endTime - startTime) / CLOCKS_PER_SEC;
cout<<"冒泡"<<t2<<endl;
//合并排序
startTime=clock();
merge_sort(c,0,199999);
endTime=clock();
t3=(double)(endTime - startTime) / CLOCKS_PER_SEC;
cout<<"合并"<<t3<<endl;
cout<<d[0]<<endl;
//快速排序
startTime=clock();
quick_sort(0,199999,d);
endTime=clock();
t4=(double)(endTime - startTime) / CLOCKS_PER_SEC;
cout<<"快速"<<t4<<endl;
//插入排序
startTime=clock();
insert_sort(e,200000);
cout<<"cha"<<endl;
endTime=clock();
t5=(double)(endTime - startTime) / CLOCKS_PER_SEC;
cout<<"插入"<<t5<<endl;
return 0;
}
算法实验一
于 2023-03-12 10:40:00 首次发布