实验名称:排序的有关操作 |
|
实验室名称:丹青909 |
实验台号:14 |
学生姓名: 陈佳龙 |
专业班级: 2015级1班 |
指导教师:于慧伶 |
实验日期:2017-6-12 |
一、实验目的
1、掌握常见的排序算法的思想及其适用条件。
2、掌握常见的排序算法的程序实现。
二、实验仪器及环境:
PC计算机;windows XP操作系统、Visual C++6.0、CodeBlocks
1、
#include
#include
#include
#include
#define MAXSIZE 200
using namespace std;
typedef struct student{
char name[25];
double score;
}*Stu,StuNode;
StuNode r[MAXSIZE+1],dp[MAXSIZE+1];
int n=0;
void Cread(){
for(int i=1;i<=n;i++)
{
cout<<"请输入第"<
cin>>r[i].name>>r[i].score;
}
}
void Show(Stu stu){
int i;
int temp=1,index=0;
for(i=1;i<=n;i++)
{
printf("%2d %15s %5.2f\n",temp,stu[i].name,stu[i].score);
if(i index++; else { temp+=index+1; index=0; } } free(stu); } void InsertSort(Stu stu){//直接插入排序 int j; StuNode temp; stu=(Stu)malloc(sizeof(StuNode)*(n+1)); for(int i=1;i<=n;i++){ strcpy(stu[i].name,r[i].name); stu[i].score=r[i].score; } for(int i=2;i<=n;i++) { temp=stu[i]; j=i-1; while(j>=1 && temp.score> stu[j].score) { stu[j+1]=stu[j]; j--; } j+=1; stu[j]=temp; } Show(stu); } void Swap(StuNode &a,StuNode &b) { StuNode temp; strcpy(temp.name,a.name); strcpy(a.name,b.name); strcpy(b.name,temp.name); temp.score=a.score; a.score=b.score; b.score=temp.score; } void BubbleSort(Stu stu){//冒泡排序 int i,j,peace; peace=1; stu=(Stu)malloc(sizeof(StuNode)*(n+1)); for(i=1;i<=n;i++){ strcpy(stu[i].name,r[i].name); stu[i].score=r[i].score; } peace=1; for(i=1;i<=n-1 && peace;i++) { peace=0; for(j=1;j<=n-i;j++) { if(stu[j].score < stu[j+1].score) { Swap(stu[j],stu[j+1]); peace=1; } } } Show(stu); } void SeletionSort(Stu stu){//选择排序 int i,j,temp; stu=(Stu)malloc(sizeof(StuNode)*(n+1)); for(i=1;i<=n;i++){ strcpy(stu[i].name,r[i].name); stu[i].score=r[i].score; } for(i=1;i<=n-1;i++) { int key=i; for(j=i+1;j<=n;j++) { if(stu[key].score { key=j; } } if(i!=key) Swap(stu[i],stu[key]); } Show(stu); } int Partition(Stu stu,int low,int high){//快速排序--排序 int Pi; stu[0]=stu[low]; Pi=stu[0].score; while(low { while(low --high; stu[low++]=stu[high]; while(low ++low; stu[high--]=stu[low]; } stu[low]=stu[0]; return low; } void QuickSort(Stu stu,int low,int high) {//快速排序--二分 int Pi; if(low { Pi=Partition(stu,low,high); QuickSort(stu,low,Pi-1); QuickSort(stu,Pi+1,high); } } void Merge(Stu stu,int low,int mid,int high) {//归并排序--归并 if(low>=high) return ; int i,j,k; StuNode temp[1005]; i=low;j=mid+1;k=0; while(i<=mid && j<=high) { if(stu[i].score>stu[j].score) temp[k++]=stu[i++]; else temp[k++]=stu[j++]; } while(i<=mid) temp[k++]=stu[i++]; while(j<=high) temp[k++]=stu[j++]; for(i=low;i<=high;i++) { stu[i]=temp[i-low]; // printf("%d ",stu[i].score); } // putchar('\n'); } void MergeSort(Stu stu,int low,int high) {//归并排序--二分 if(low>=high) return ; int mid=(low+high)/2; MergeSort(stu,low,mid); MergeSort(stu,mid+1,high); Merge(stu,low,mid,high); } int main() { Stu stu; cout<<"请输入学生总人数n:"; cin>>n; Cread(); cout<<" 冒泡法排序 :"< BubbleSort(stu); cout<<" 直接插入法排序 :"< InsertSort(stu); cout<<" 选择法排序 :"< SeletionSort(stu); cout<<" 快速法排序 :"< stu=(Stu)malloc(sizeof(StuNode)*(n+1)); for(int i=1;i<=n;i++){ strcpy(stu[i].name,r[i].name); stu[i].score=r[i].score; } QuickSort(stu,1,n); Show(stu); cout<<" 归并法排序 :"< stu=(Stu)malloc(sizeof(StuNode)*(n+1)); for(int i=1;i<=n;i++){ strcpy(stu[i].name,r[i].name); stu[i].score=r[i].score; } MergeSort(stu,1,n); Show(stu); return 0; } 1、 掌握各种排序方法的时间和空间复杂度分析,分析出排序算法最好情况,最坏情况,和平均情况的时间性能。 签名: 年 月 日四、实验心得体会:(包括遇到的问题及解决办法)
五、指导教师意见及成绩