IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 数据结构01:熟悉排序 -> 正文阅读

[数据结构与算法]数据结构01:熟悉排序

一、实验目的和要求

熟悉排序算法和内存管理

二、实验环境

语言:C++
环境:IDEA Dev-C++ 5.11

三、实验内容

将100、1000、…、1000000个数据排序

时间如何?

空间如何?

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

四、实验过程

?

4.1 任务定义和问题分析

1.编写程序运行计时器

2.编写随机数产生器

3.寻找适用于大量数据处理的排序算法

4.根据各排序算法运行时间寻找合适的算法

5.改进算法并增加数据处理量

6.编译器内存申请和管理

7.实现数据内外交互

4.2 概要设计(数据结构)

程序目标:开发一个能完成尽可能多的数据排序的程序

主要功能包括:

  1. 各类排序算法函数
  2. 程序运行计时器
  3. 随机数产生器
  4. 调用排序算法的主函数
  5. 内存管理
  6. 运行结果输出
  7. 数据内外交互

4.3 详细设计

  1. 各类排序算法函数:
  1. 冒泡排序
  2. 选择排序
  3. 插入排序
  4. 希尔排序
  5. 快速排序
  6. 归并排序
  7. 堆排序
  8. 基数排序
  9. 库函数sort()

2.利用时间种子产生相应数量的随机数。

3.使用C++数据流将输出结果导入txt文件实现数据的交互。

4.将数组定义为全局变量或将数组定义在堆上,以申请更大的内存。

五、测试及结果分析

5.1 实验数据

???????? 本次实验的数据均由C++种子随机数生成器产生

    1. 结果及分析

一、第一次排序 测试数据100000个:

  1. 冒泡排序

?

总共用时26.432s 稳定,耗时较长,内存消耗较大

  1. 选择排序

?

总共用时13.177s 不稳定,耗时较长,内存消耗较大

  1. 插入排序

?

总共用时8.216s 稳定,耗时较短,内存消耗较少

  1. 希尔排序

?

总共用时8.073s 不稳定,耗时较短,内存消耗较少

  1. 快速排序

?

总共用时8.201s 不稳定,耗时较短,内存消耗较少

  1. 归并排序

?

总共用时8.175s 稳定,耗时较短,内存消耗较少

  1. 堆排序

?

总共用时8.392s 不稳定,耗时较短,内存消耗较少

  1. 基数排序

?

?? 总共用时8.561s 稳定,耗时较短,内存消耗较少

??

9.库函数sort()

?

总共用时8.038s 稳定,耗时较短,内存消耗较少

综上,选择快速排序进行下一步实验

第二次实验:

测试数据1000000个:

?

输出排序结果总共用时:78.203 s

?

不输出排序结果总共用时:0.109 s

测试数据10000000个:

?

输出排序结果总共用时:694.931 s

?

不输出排序结果总共用时:2.160 s

测试数据100000000个:

?

不输出最后排序结果,总共用时:128.282 s

综上,最多能完成100000000个随机数的排序

六、实验收获

1.实验前的准备很重要,比起打开电脑就开始漫无目的开始写代码,不如在开始前先对问题进行解析,学会把任务进行分解,设计解决问题的思路和流程,这样不但能在完成小块任务时获得成就感和动力,也能使问题解决更加清晰明了,逻辑更加严密。

2.遇到问题先思考,不要被问题的难度吓到,而是应该分析、尝试并不断调整。

3.实验时遇到无法解决的困难需要交流,别人的思路会给你带来新的启发,证明和证伪的过程也是新的学习过程,在尝试和探索的过程中总能有新的收获,这样不但能锻炼独立思考的能力,也能培养我们的合作意识。

4.实验过程中难免会经历失败,这需要我们马上调整心态,挫折不可避免但是需要以坦然来面对,有时候不需要太过执着,换个思路也许就是解决方案。

5.及时记录数据很重要!不小心把运行了好久的代码关掉很抓狂,所以一定一定要小心谨慎,运行的时候不要乱动电脑。

七、参考文献

一些csdn的文章😊

八、附录(源代码)

第一次实验::

#include<iostream>

#include<cstdlib>

#include<ctime>

#include<cstdio>

#include<cstring>

#include<algorithm>

#include<fstream>

using namespace std;



//冒泡排序

void BubbleSort(int arr[],int length) {

???????? for (int i = 0; i < length; i++) {

????????????????? for (int j = 0; j <= length - i - 1; j++) {

????????????????????????? if (arr[j+1] < arr[j]){

?????????????????????????????????? int temp = arr[j+1];

?????????????????????????????????? arr[j+1] = arr[j];

?????????????????????????????????? arr[j] = temp;

????????????????????????? }

????????????????? }

???????? }

}



//选择排序

void SelectSort(int arr[], int length) {

???????? for (int i = 0; i < length; i++) {

????????????????? int min = i;

????????????????? for (int j = i + 1; j < length; j++) {

????????????????????????? if (arr[j] < arr[min]) {

?????????????????????????????????? min = j;

????????????????????????? }????????????????????????

????????????????? }

????????????????? if (min != i) {

????????????????????????? int temp = arr[min];

????????????????????????? arr[min] = arr[i];

????????????????????????? arr[i] = temp;

????????????????? }

???????? }

}



//插入排序

void InsertSort(int arr[], int length) {

???????? int j;

???????? for (int i = 1; i < length; i++) {

????????????????? if (arr[i] < arr[i - 1]) {

????????????????????????? int temp = arr[i];

????????????????????????? for (j = i - 1; j >= 0 && temp < arr[j]; j -- ) {

?????????????????????????????????? arr[j + 1] = arr[j];????

????????????????????????? }

????????????????????????? arr[j + 1] = temp;

????????????????? }

???????? }

}



//希尔排序

void ShellSort(int arr[],int length ) {

???????? int increasement = length;

???????? int i,j,k;????

???????? do{

????????????????? increasement = increasement / 3 + 1;

????????????????? for (i = 0; i < increasement; i++) {

????????????????????????? for (j = i + increasement; j < length; j+=increasement) {

?????????????????????????????????? if (arr[j] < arr[j - increasement]) {

??????????????????????????????????????????? int temp = arr[j];

??????????????????????????????????????????? for (k = j - increasement; k >= 0 && temp < arr[k]; k -= increasement) {

???????????????????????????????????????????????????? arr[k + increasement] = arr[k];

??????????????????????????????????????????? }

??????????????????????????????????????????? arr[k + increasement] = temp;

?????????????????????????????????? }

????????????????????????? }

????????????????? }

???????? } while (increasement > 1);

}



//快速排序

void QuickSort(int arr[],int start,int end) {

???????? int i = start;

???????? int j = end;

???????? int temp = arr[start];

???????? if (i < j) {

????????????????? while(i < j){

????????????????????????? while (i < j&&arr[j]>=temp){

?????????????????????????????????? j--;

????????????????????????? }

????????????????????????? if (i < j) {

?????????????????????????????????? arr[i] = arr[j];

?????????????????????????????????? i++;

????????????????????????? }

????????????????????????? while (i < j&&arr[i] < temp) {

?????????????????????????????????? i++;

????????????????????????? }

????????????????????????? if (i < j) {

?????????????????????????????????? arr[j] = arr[i];

?????????????????????????????????? j--;

????????????????????????? }

????????????????? }

????????????????? arr[i] = temp;

????????????????? QuickSort(arr, start, i - 1);

????????????????? QuickSort(arr, j + 1, end);

???????? }

}



//归并排序

void Merge(int arr[], int l, int q, int r){

??? int n=r-l+1,i=0,left=l,right=q+1;

??? int* tmp=new int[n];

??? while(left<=q && right<=r)

??????? tmp[i++] = arr[left]<= arr[right]?arr[left++]:arr[right++];

??? while(left<=q)

??????? tmp[i++]=arr[left++];

??? while(right<=r)

??????? tmp[i++]=arr[right++];

??? for(int j=0;j<n;++j)

??????? arr[l+j]=tmp[j];

??? delete [] tmp;

}

void MergeSort(int arr[], int l, int r){

??? if(l==r)

??????? return;

??? int q = (l + r)/2;

??? MergeSort(arr, l, q);

??? MergeSort(arr, q + 1, r);

??? Merge(arr, l, q, r);

}



//堆排序

void adjust(int arr[], int len, int index)

{

??? int left = 2*index + 1;

??? int right = 2*index + 2;

??? int maxIdx = index;

??? if(left<len && arr[left] > arr[maxIdx]) maxIdx = left;

??? if(right<len && arr[right] > arr[maxIdx]) maxIdx = right;

?? ?if(maxIdx != index)

??? {

??????? int temp = arr[maxIdx];

????????????????? arr[maxIdx] = arr[index];

????????????????? arr[index] = temp;

??????? adjust(arr, len, maxIdx);

??? }



}

void HeapSort(int arr[], int size)

{

??? for(int i=size/2 - 1; i >= 0; i--)

??? {

??????? adjust(arr, size, i);

??? }

??? for(int i = size - 1; i >= 1; i--)

??? {

??????? int temp = arr[0];

????????????????? arr[0] = arr[i];

????????????????? arr[i] = temp;

??????? adjust(arr, i, 0);

??? }

}



//基数排序

void RadixSort(int*a,int length) {

???????? int i, max = a[0], base = 1;

???????? for (i = 0; i < length; i++) {

????????????????? if (a[i] > max) {

????????????????????????? max = a[i];

????????????????? }

???????? }

???????? int *t = new int[8*length];

???????? while (max / base > 0) {

????????????????? int bucket[10] = { 0 };

????????????????? for (i = 0; i < length; i++) {

????????????????????????? bucket[a[i] / base % 10]++;

????????????????? }

????????????????? for (i = 1; i < 10; i++) {

????????????????????????? bucket[i] += bucket[i - 1];

????????????????? }

????????????????? for (i =length - 1; i>= 0; i--) {

????????????????????????? t[bucket[a[i] / base % 10 ]-1] = a[i];

????????????????????????? bucket[a[i] / base % 10]--;

????????????????? }

????????????????? for (i = 0; i < length; i++) {

????????????????????????? a[i] = t[i];

????????????????? }

????????????????? base = base * 10;

???????? }

}



//c++库函数sort()

void SortSort(int arr[], int len) {

???????? sort(arr,arr+len);

}



int main() {

???????? ofstream fout("output.txt");

????????

???????? int a[100000] = { 0 };

???????? srand((unsigned)time(NULL));

???????? for (int i = 0; i < 100000; i++)

????????????????? a[i] = rand();

????????

???????? clock_t start = clock();

????????

???????? //BubbleSort(a,100000);

???????? //SelectSort(a,100000);

???????? //InsertSort(a,100000);

???????? //ShellSort(a,100000);

???????? //QuickSort(a,0,100000);

???????? //MergeSort(a,0,100000);

???????? //HeapSort(a,100000);

???????? //RadixSort(a,100000);

???????? SortSort(a,100000);

???????? for(int i = 0; i < 100000; i++){

????????????????? cout << a[i] << " ";

????????????????? fout << a[i] << " ";???

???????? }

???????? cout << endl;

????????

???????? clock_t end = clock();

???????? double endtime = (double)(end - start) / CLOCKS_PER_SEC;

???????? cout << endl;

???????? cout << "Total time:" << endtime << "s" << endl;

???????? fout << flush;

???????? fout.close();

???????? return 0;

}

第二次实验:

#include<iostream>

#include<cstdlib>

#include<ctime>

#include<cstdio>

#include<cstring>

#include<algorithm>

using namespace std;



//快速排序

void QuickSort(int arr[],int start,int end) {

???????? int i = start;

???????? int j = end;

???????? int temp = arr[start];

???????? if (i < j) {

????????????????? while(i < j){

????????????????????????? while (i < j&&arr[j]>=temp){

?????????????????????????????????? j--;

????????????????????????? }

????????????????????????? if (i < j) {

?????????????????????????????????? arr[i] = arr[j];

?????????????????????????????????? i++;

????????????????????????? }

????????????????????????? while (i < j&&arr[i] < temp) {

?????????????????????????????????? i++;

????????????????????????? }

????????????????????????? if (i < j) {

?????????????????????????????????? arr[j] = arr[i];

?????????????????????????????????? j--;

????????????????????????? }

????????????????? }

????????????????? arr[i] = temp;

????????????????? QuickSort(arr, start, i - 1);

????????????????? QuickSort(arr, j + 1, end);

???????? }

}



????????

int main() {

???????? clock_t start = clock();

????????

???????? int *a;

??? a=new int[100000000];

???????? srand((unsigned)time(NULL));

???????? for (int i = 0; i < 100000000; i++)

????????????????? a[i] = rand();



???????? QuickSort(a,0,100000000);

???????? //MergeSort(a,0,100000);

???????? //HeapSort(a,100000);



???????? for(int i = 0; i < 100000000; i++)

????????????????? cout << a[i] << " ";

???????? cout << endl;

????????

???????? clock_t end = clock();

???????? double endtime = (double)(end - start) / CLOCKS_PER_SEC;

???????? cout << endl;

???????? cout << "Total time:" << endtime << "s" << endl;

???????? return 0;

}

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-09-24 21:19:25  更:2022-09-24 21:22:45 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 21:20:50-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码