算法实验一

#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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值