南邮数据结构实验四----各种内排序算法的实现及性能比较
来源:互联网 发布:linux oracle rpm安装 编辑:程序博客网 时间:2024/05/20 10:14
一、 实验目的和要求
内容:
验证教材的各种内排序算法。分析各种排序算法的时间复杂度。
要求:
使用随机数产生器产生大数据集合,运行上述各种排序算法,使用系统时钟测量各算法所需的实际时间,并进行比较。
这个程序一共包含两个模块,分别是单个排序算法的测试,和多个排序算法的共同测试比较。一共包含了8个排序算法。分别是简单选择排序,直接插入排序,冒泡排序,快速排序(调用系统栈),改进的快速排序(手动栈),为了与STL的sort对比,加入了STL库的快速排序,还有两路合并排序,堆排序
nxu#include <iostream>#include <cstdio>#include <ctime>#include <cstdlib>#include <stack>#include <algorithm>using namespace std;const int size=10000; //数组大小const int cnt=50; //重复执行次数int a[size+10];void Swap(int &x,int &y){ int tmp=x; x=y; y=tmp;}void Menu(){ system("cls"); printf("---------------------------------内排序测试系统------------------------------\n\n\n"); printf("--------------------------------1.简单选择排序-------------------------------\n"); printf("--------------------------------2.直接插入排序-------------------------------\n"); printf("--------------------------------3.冒泡排序-----------------------------------\n"); printf("--------------------------------4.快速排序-----------------------------------\n"); printf("--------------------------------5.改进的快速排序-----------------------------\n"); printf("--------------------------------6.STL库的快速排序----------------------------\n"); printf("--------------------------------7.两路合并排序-------------------------------\n"); printf("--------------------------------8.堆排序-------------------------------------\n"); printf("--------------------------------9.分别运行以上所有排序,给出对比---------\n"); printf("--------------------------------0.退出系统-----------------------------------\n"); printf("\n\n\n 输入你的选择:");}void SeleteSort(){ int i; printf("\n正在进行%d次简单选择排序......\n",cnt); for(int k=0;k<cnt;k++) { srand(time(NULL)+k*10); for(i=0;i<size;i++) { a[i]=rand(); //rand()范围是0-32767 } for(i=0;i<size-1;i++) { int index=i; for(int j=i+1;j<size;j++) { if(a[j]<a[index]) { index=j; } } Swap(a[i],a[index]); } }}void InsertSort(){ int i; printf("\n正在进行%d次插入排序......\n",cnt); for(int k=0;k<cnt;k++) { srand(time(NULL)+k*10); for(i=0;i<size;i++) { a[i]=rand(); //rand()范围是0-32767 } for(i=1;i<size;i++) { int j=i; int tmp=a[i]; while(j>0&&tmp<a[j-1]) { a[j]=a[j-1]; j--; } a[j]=tmp; } }}void BubbleSort(){ int i,j,last; printf("\n正在进行%d次冒泡排序......\n",cnt); for(int k=0;k<cnt;k++) { srand(time(NULL)+k*10); for(i=0;i<size;i++) { a[i]=rand(); //rand()范围是0-32767 } i=size-1; while(i>0) { last=0; for(j=0;j<i;j++) { if(a[j+1]<a[j]) { Swap(a[j],a[j+1]); last=j; } } i=last; } }}void Qsort(int left,int right){ int i=left,j=right+1; if(left<right) { do { do { i++; }while(a[i]<a[left]); do { j--; }while(a[j]>a[left]); if(i<j) Swap(a[i],a[j]); }while(i<j); Swap(a[left],a[j]); Qsort(left,j-1); Qsort(j+1,right); }}void QuickSort(){ printf("\n正在进行%d次快速排序......\n",cnt); a[size]=100000000; for(int k=0;k<cnt;k++) { srand(time(NULL)+k*10); for(int i=0;i<size;i++) { a[i]=rand(); //rand()范围是0-32767 } Qsort(0,size-1);// for(int i=0;i<10;i++)// {// printf("%d ",a[i]);// }// printf("\n"); }}struct note{ int left; int right; note(int a,int b) { left=a; right=b; }};void ImprovedQuickSort() //改善的快速排序,用局部栈代替系统栈,并将A[(left+right)/2]作为分割元素{ printf("\n正在进行%d次改善版本的快速排序......\n",cnt); a[size]=100000000; int i,j; for(int k=0;k<cnt;k++) { srand(time(NULL)+k*10); for(int i=0;i<size;i++) { a[i]=rand(); //rand()范围是0-32767 } stack<note> S; note tmp(0,size-1); S.push(tmp); while(!S.empty()) { tmp=S.top(); S.pop(); int left=tmp.left; int right=tmp.right; if(left<right) { Swap(a[left],a[(left+right)/2]); i=left; j=right+1; do { do { i++; }while(a[i]<a[left]); do { j--; }while(a[j]>a[left]); if(i<j) Swap(a[i],a[j]); }while(i<j); Swap(a[left],a[j]); if(left<j-1) { note t1(left,j-1); S.push(t1); } if(j+1<right) { note t2(j+1,right); S.push(t2); } } } }}void STLsort(){ printf("\n正在进行%d次STL库函数sort快速排序......\n",cnt); for(int k=0;k<cnt;k++) { srand(time(NULL)+k*10); for(int i=0;i<size;i++) { a[i]=rand(); //rand()范围是0-32767 } sort(a,a+size); }}int tmp[size];void Merge(int i1,int j1,int i2,int j2){ int i,j,k; i=i1; j=i2; k=0; while(i<=j1&&j<=j2) { if(a[i]<=a[j]) tmp[k++]=a[i++]; else tmp[k++]=a[j++]; } while(i<=j1) tmp[k++]=a[i++]; while(j<=j2) tmp[k++]=a[j++]; for(i=0;i<k;i++) a[i1++]=tmp[i];}void MergeSort(){ printf("\n正在进行%d次两路合并排序排序......\n",cnt); for(int k=0;k<cnt;k++) { srand(time(NULL)+k*10); for(int i=0;i<size;i++) { a[i]=rand(); //rand()范围是0-32767 } int i1,i2,j1,j2; int Size=1; while(Size<size) { i1=0; while(i1+Size<size) { i2=i1+Size; j1=i2-1; if(i2+Size-1>size-1) { j2=size-1; } else { j2=i2+Size-1; } Merge(i1,j1,i2,j2); i1=j2+1; } Size*=2; } }}void AdjustDown(int r,int j){ int ch=2*r+1; int temp=a[r]; while(ch<=j) { if(ch<j && a[ch]<a[ch+1]) ch++; if(temp>=a[ch]) break; a[(ch-1)/2]=a[ch]; ch=2*ch+1; } a[(ch-1)/2]=temp;}void HeapSort(){ int i; printf("\n正在进行%d次堆排序......\n",cnt); for(int k=0;k<cnt;k++) { srand(time(NULL)+k*10); for(i=0;i<size;i++) { a[i]=rand(); //rand()范围是0-32767 } for(i=(size-2)/2;i>=0;i--) { AdjustDown(i,size-1); } for(i=size-1;i>0;i--) { Swap(a[0],a[i]); AdjustDown(0,i-1); }// for(int i=0;i<10;i++)// {// printf("%d ",a[i]);// }// printf("\n"); }}void SortOne(int choice){ system("cls"); printf("--------------------------------单个排序测试-------------------------------\n\n\n"); clock_t StartTime,EndTime; printf("%d 个数据,进行 %d 次排序,数据大小范围 0~32767\n\n开始排序,并开始计时......\n\n",size,cnt); StartTime=clock(); switch (choice) { case 1: SeleteSort(); break; case 2: InsertSort(); break; case 3: BubbleSort(); break; case 4: QuickSort(); break; case 5: ImprovedQuickSort(); break; case 6: STLsort(); break; case 7: MergeSort(); break; case 8: HeapSort(); break; } EndTime=clock(); double len=(double(EndTime-StartTime))/CLOCKS_PER_SEC; printf("排序完成,停止计时,一共花费时间为 %.3f 秒\n",len); system("pause");}void SortAll(){ system("cls"); printf("--------------------------------排序对比测试-------------------------------\n\n\n"); printf("%d 个数据,进行 %d 次排序,数据大小范围 0~32767\n\n",size,cnt); clock_t StartTime,EndTime; double record[15]; StartTime=clock(); SeleteSort(); EndTime=clock(); double len=(double(EndTime-StartTime))/CLOCKS_PER_SEC;; record[0]=len; printf("时间%.3f秒\n",len); StartTime=clock(); InsertSort(); EndTime=clock(); len=(double(EndTime-StartTime))/CLOCKS_PER_SEC;; record[1]=len; printf("时间%.3f秒\n",len); StartTime=clock(); BubbleSort(); EndTime=clock(); len=(double(EndTime-StartTime))/CLOCKS_PER_SEC;; record[2]=len; printf("时间%.3f秒\n",len); StartTime=clock(); QuickSort(); EndTime=clock(); len=(double(EndTime-StartTime))/CLOCKS_PER_SEC;; record[3]=len; printf("时间%.3f秒\n",len); StartTime=clock(); ImprovedQuickSort(); EndTime=clock(); len=(double(EndTime-StartTime))/CLOCKS_PER_SEC;; record[4]=len; printf("时间%.3f秒\n",len); StartTime=clock(); STLsort(); EndTime=clock(); len=(double(EndTime-StartTime))/CLOCKS_PER_SEC;; record[5]=len; printf("时间%.3f秒\n",len); StartTime=clock(); MergeSort(); EndTime=clock(); len=(double(EndTime-StartTime))/CLOCKS_PER_SEC;; record[6]=len; printf("时间%.3f秒\n",len); StartTime=clock(); HeapSort(); EndTime=clock(); len=(double(EndTime-StartTime))/CLOCKS_PER_SEC;; record[7]=len; printf("时间%.3f秒\n\n",len); double maxx=-1,minn=1000; for(int i=0;i<8;i++) { if(record[i]>maxx) maxx=record[i]; if(record[i]<minn) minn=record[i]; } printf("最快的%.3f秒,最慢的%.3f秒\n",minn,maxx); system("pause");}int main(){ int choice; while(1) { Menu(); cin>>choice; if(choice>=1&&choice<=8) { SortOne(choice); } else if(choice==9) { SortAll(); } else if(choice==0) { return 0; } else { cout<<"-------------------------输入有误--------------------------------"<<endl; system("pause"); } } return 0;}
0 0
- 南邮数据结构实验四----各种内排序算法的实现及性能比较
- 各种内排序算法的实现及性能比较
- 南邮数据结构试验---各种内排序算法实现及比较
- 数据结构实验4(排序算法的实现及性能分析)
- 排序算法的比较和实现(南邮数据结构第四次实验)
- 各种排序算法的C++实现与性能比较
- 各种排序算法的C++实现与性能比较
- 各种排序算法的C++实现与性能比较
- 各种排序算法的C++实现与性能比较
- 各种排序算法的C++实现与性能比较
- 各种排序算法的C++实现与性能比较
- 各种排序算法的C++实现与性能比较
- [排序算法] 各种排序算法(内排序)的比较及选择依据
- 数据结构----各种排序算法的比较
- 数据结构的各种排序算法稳定性比较
- 数据结构----各种排序算法的比较
- 各种排序算法的性能比较
- 各种排序算法的性能比较
- Prism4文档翻译(第一章 第五部分)
- python直方图均衡化直观理解
- 在数组中查找出现奇数次的元素
- linux c tool系列------getevent.c
- 【linux】RPM
- 南邮数据结构实验四----各种内排序算法的实现及性能比较
- 搭建IntelliJ IDEA+maven+jetty+SpringMVC 开发环境(二)
- 基于Dubbo协议的项目示例及详细讲解(二)
- GCC 升级4.8 支持c++11
- IO多路复用之epoll
- 列表,元组里面常用的几种函数以及方法
- git 删除某个project的远程仓库及其下属所有分支
- 三极管放大电路
- spark 窗口函数row_number练习以及用spark core实现