数据结构 课后作业01 实现尽可能多个数的排序

这篇实验报告详述了对多种排序算法(插入、选择、冒泡、希尔、快速)的性能测试,着重关注运行时间和内存使用。在不同规模的数据集上,观察到快速排序在效率上的优势,特别是在大数据量时。对于排序速度较慢的冒泡排序,通过改用快速排序进行了优化。测试结果记录在文件中,并分析了各种排序方法的适用场景。
摘要由CSDN通过智能技术生成

实验序号及名称:实验 课后作业01     有限个数的数据排序                    

一、实验目的和要求

了解一个程序编写的完整过程,将对编程的整体概念加以完善。清楚需求分析比写代码重要这一点,训练需求分析时的思维发散能力与全局思维。

要求尽可能多的完成数据排序,并显示运行时间。

二、实验环境

软件:Windows 10 家庭中文版、Dev C++、Visual Studio2019

硬件:Legion Y9000P2021 LAPTOP-1TAC9IV1

          11th Gen Intel(R) Core(TM) i7-11800H @ 2.30GHz 2.30 GHz

三、实验内容

尽可能完成多的数据排序,并显示运行时间。 

四、实验过程

用文字、图(流程图等)、表格等方式记录实验过程中分析、设计工作。

4.1 任务定义和问题分析

任务定义:

        一个将排序问题追根究底、制作有对外接口的程序的任务

问题分析:

        1、排序采用的方法

        2、排序所需的时间

        3、排序所占用的内存

        4、排序的输入输出问题

        5、排序所用的操作系统

4.2 概要设计(数据结构)


                逻辑结构:集合

                存储结构:数组、顺序结构

                运算:排序    

4.3 详细设计

建立模型:

        对一个数组进行排序,有插入排序、冒泡排序、选择排序、归并排序、快速排序

构造求解算法:

        选择冒泡排序,随机数产生选用相同的种子保证每次产生的随机数相等,消除因不同数字的排序工作量不同而产生的实验误差。

设计储存结构:

        用文件流将生成数据与排序后数据写入test.txt文件。

五、测试及结果分析

对各种数据运行程序和算法的结果记录和分析,并对错误所作的修改和结果。

5.1 实验数据

用于测试算法和程序的测试数据。

十万

百万

千万

亿

插入

0.000

0.000

0.000

0.002

0.012

0.123

1.203

12.269

选择

0.000

0.000

0.000

0.107

11.427

失败(dev

冒泡

0.000

0.000

0.001

0.109

18.092

失败(vs)

希尔

0.000

0.000

0.000

0.001

0.016

0.236

3.650

54.783

快排

0.000

0.000

0.000

0.000

0.007

0.121

4.911

437.273

5.2 结果及分析

测试一:十个数的排序  排序用时0.000s

测试二:百个数的排序  排序用时0.000s

测试三:千个数的排序  排序用时0.001s

测试四:万个数的排序  排序用时0.109s

测试五:十万个数的排序  排序用时18.092s

测试六:百万个数的排序  失败

测试七:百万个数的排序  排序用时0.145s

        改进:将数组声明在全局储存区或堆上;冒泡排序速度过慢改为快速排序            

测试八:千万个数的排序  排序

        改进:冒泡排序速度过慢改为快速排序

测试九:亿个数的排序  

        改进:冒泡排序速度过慢改为快速排序

测试十:插入排序的测试

测试十一:选择排序的测试

测试十二:希尔排序的测试

测试十三:快速排序的测试

    

#include<iostream>
#include<fstream>
#include <stdlib.h>
#include <stdio.h>
#include<ctime>
#include<iomanip>
#include<vector>
using namespace std;

void insertionsort(int data[], int n){
  for (int i = 0; i < n; ++i) {
    for (int j = 0; j < data[j]; ++j) {
		int temp = data[j - 1];
		data[j - 1] = data[j];
		data[j] = temp;
    }
  }
}

void selectionsort(int data[], int n) {
  int mid;
  for (int i = 0; i < n - 1; ++i) {
    mid = i;
    for (int j = 0; j < n; ++j) {
      if (data[j] < data[mid]) mid = j;
    }
    int temp = data[mid];
	data[mid] = data[i];
	data[i] = temp;
  }
}

void bubblesort(int data[],int n){
	int temp;
	for (int i = 0; i <n; i++)
	{
		for (int j = n - 1; j > i; j--)
		{
			if (data[j]<data[j-1])
			{
				temp = data[j - 1];
				data[j - 1] = data[j];
				data[j] = temp;
			}
		}
	}
}

void shellsort(int data[], int n){
	int k = 0, m = 1, increments[20];
	while (m < n / 3)
	{
		increments[k++] = m;
		m = m * 3 + 1;
	}
	for (m = k - 1; m >= 0; m--)
	{
		int h = increments[m]; 
		for (int i = h; i < 2 * h; i++)
		{
			for (int j = i; j < n;)
			{
				int temp = data[j];
				k = j;
				while (k - h > 0 && temp < data[k - h])
				{
					data[k] = data[k - h];
					k -= h;
				}
				data[k] = temp;
				j += h;
			}
		}
	}
}

void quicksort(int data[], int l, int r) {
  if (l + 1 >= r) {
    return;
  }
  int first = l, last = r - 1, key = data[first];
  while (first < last) {
    while (first < last && data[last] >= key) {
      --last;
    }
    data[first] =data[last];
    while (first < last && data[first] <= key) {
      ++first;
    }
    data[last] =data[first];
  }
  data[first] = key;
  quicksort(data, l, first);
  quicksort(data, first + 1, r);
}

void random(int ran_num[],int n){
	srand(1);
	for (int i = 0; i < n; i++) {
		ran_num[i]= rand() % 9999 + 1;
	}
	cout << endl;
}

void output(int data[],int n)
{
	for(int j=0;j<n;j++)
	{
		cout << setw(7) << data[j] << " ";
	}
	
}
	

int main()
{
	int n ;
	cin>>n; 
	int * ran_num;
	ran_num = new int[n];
	random(ran_num,n);
	output(ran_num,n);
	cout<<endl;
	
	FILE * out;//写入文件
    if((out = fopen("test.txt","wb"))==NULL)
	{
      printf("cannot open the file");
      exit(0);
    }
    
    for(int i=0;i<n;i++)
	{
      fprintf(out,"%d ",ran_num[i]);
    }
    fclose(out);
    
    delete[]ran_num;
    int * ran_nums;
	ran_nums = new int[n];
    
    ifstream in("test.txt", ios::in);//读写文件
	if (!in.is_open())
	{
		cout << "open error!" << endl;
		exit(0);
	}
	int i = 0;
	vector<double> v1(n);
	while (!in.eof() && i < n)
	{
		in >> ran_nums[i];
		i++;
	}
		
	clock_t start_time1, end_time1, start_time2, end_time2, start_time3, end_time3, start_time4, end_time4, start_time5, end_time5;
	/*start_time1 = clock();
	insertionsort(ran_nums, n);//插入
	end_time1 = clock();*/
	/*start_time2 = clock();
	selectionsort(ran_nums, n);//选择
	end_time2 = clock();*/
	/*start_time3 = clock();
	bubblesort(ran_num, n);//冒泡
	end_time3 = clock();*/
	/*start_time4 = clock();
	shellsort(ran_nums, n);//希尔
	end_time4 = clock();*/
	start_time5 = clock();
	quicksort(ran_nums,1, n);//快速
	end_time5 = clock();
	output(ran_nums,n);
	cout<<endl;
	cout << "排序共用时:" << ((double)end_time5 - (double)start_time5) / CLOCKS_PER_SEC << "s" << endl;
	delete[]ran_nums;
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值