实验序号及名称:实验 课后作业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;
}