数据结构实验:多种排序实践
Posted 赵同学的代码时间
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构实验:多种排序实践相关的知识,希望对你有一定的参考价值。
7-1 排序 (25分)
给定个(长整型范围内的)整数,要求输出从小到大排序后的结果。
本题旨在测试各种不同的排序算法在各种数据情况下的表现。各组测试数据特点如下:
数据1:只有1个元素;
数据2:11个不相同的整数,测试基本正确性;
数据3:103个随机整数;
数据4:104个随机整数;
数据5:105个随机整数;
数据6:105个顺序整数;
数据7:105个逆序整数;
数据8:105个基本有序的整数;
数据9:105个随机正整数,每个数字不超过1000。
输入格式:
输入第一行给出正整数(≤105),随后一行给出个(长整型范围内的)整数,其间以空格分隔。
输出格式:
在一行中输出从小到大排序后的结果,数字间以1个空格分隔,行末不得有多余空格。
输入样例:
11
4 981 10 -17 0 -20 29 50 8 43 -5输出样例:
-20 -17 -5 0 4 8 10 29 43 50 981
方法1:简单粗暴STLsort+vector AC代码总计需要2分钟
直接使用STL
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> data;
int main()
{
int N, i;
cin >> N;
for (int j = 0; j < N; j++)
{
cin >> i;
data.push_back(i);
}
sort(data.begin(), data.end());
vector<int>::iterator it;
for (it = data.begin(); it != data.end() - 1; it++)
cout << *it << ' ';
cout << *it;
}
这个方法可以看出,STL确实是一个强大的高效算法模板库。
方法二:快速排序
采用,根据理论我们知道它是一定能够在要求的时间内完成排序任务的。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> Data;
int Partition(int low,int high)
{
int pivotloc;
pivotloc = Data[low];
while(low<high)
{
while(low<high && Data[high]>=pivotloc)high--;
Data[low] = Data[high];
while(low<high && Data[low]<=pivotloc)low++;
Data[high] = Data[low];
}
Data[low] = pivotloc;
return low;
}
void QSort(int low,int high)
{
int pivotloc;
if(low < high)
{
pivotloc = Partition(low,high);
QSort(low,pivotloc-1);
QSort(pivotloc+1,high);
}
}
int main()
{
int N,i;
cin >> N;
for(int j=0;j<N;j++)
{
cin>>i;
Data.push_back(i);
}
QSort(0,N-1);
vector<int>::iterator it;
for(it = Data.begin();it != Data.end()-1;it++)
cout << *it << ' ';
cout << *it;
}
方法三:希尔排序
,我采用手工给出delta序列的方法,在最后时间上,竟然超过了前两个算法。
using namespace std;
vector<int> Data;
void Shellinsert(int d)
{
for(int i = d; i < Data.size(); i++)
{
if(Data[i] < Data[i-d])
{
int j, tmp = Data[i];
for(j = i-d; j >= 0 && Data[j] >= tmp; j -= d);//循环让j停留在待插入位置
j += d;//插入位置
for(int k = i; k != j; k -= d)Data[k] = Data[k-d];//后移
Data[j] = tmp;//插入
}
}
}
void ShellSort()
{
int a[11] = {107, 93, 79, 51, 47, 37, 29, 11, 7, 3, 1};
for(int i = 0 ; i < 11 ; i++)
Shellinsert(a[i]);
}
int main()
{
int N,i;
cin >> N;
for(int j=0;j<N;j++)
{
cin>>i;
Data.push_back(i);
}
ShellSort();
vector<int>::iterator it;
for(it = Data.begin();it != Data.end()-1;it++)
cout << *it << ' ';
cout << *it;
}
方法四:借助STL建堆进行堆排序
STL关于堆的函数为
make_heap(iterator begin,iterator end, cmp)建堆
cmp=less()建大顶堆
cmp=greater()建小顶堆
pop_heap(iterator begin,iterator end, cmp)将堆第一个元素放到最后(取出第一个元素)然后重新按堆排列,注意,如果反复使用这个语句,只能取出两个值,必须要再加上pop_back()才能“真正”取出。
push_heap(iterator begin,iterator end, cmp)按照堆规则添加元素
使用的方法,将通过的时间降低到了两位数
比前三个算法又更快了许多。
using namespace std;
vector<int> Data;
void HeapSort()
{
vector<int> Data2;
Data2 = Data;
make_heap(Data2.begin(),Data2.end(),greater<int>());//借助STL建堆
for(int i=0;i<Data.size();i++)
{
Data[i]=Data2[0];//取堆顶
pop_heap(Data2.begin(),Data2.end(),greater<int>());
Data2.pop_back();//取出并重排
}
return;
}
int main()
{
int N,i;
cin >> N;
for(int j=0;j<N;j++)
{
cin>>i;
Data.push_back(i);
}
HeapSort();
vector<int>::iterator it;
for(it = Data.begin();it != Data.end()-1;it++)
cout << *it << ' ';
cout << *it;
}
总结:
以上三个算法,在实际运行时间上,逐个从四位数降到三位数再降到两位数,当然,两位数与STL的使用是有着密切的关系的,倘若我自己写堆函数,可能也无法达到两位数的惊人成绩,所以,STL在提升速度方面和简化代码方面有着巨大的作用,通过这一道题,实现了昨天推送中学习的几种重要算法。
以上是关于数据结构实验:多种排序实践的主要内容,如果未能解决你的问题,请参考以下文章
2017-2018-2 20179204《网络攻防实践》缓冲区溢出漏洞实验
实验5 MapReduce初级编程实践——编写程序实现对输入文件的排序
2017-2018-2 20179216 《网络攻防与实践》第十周作业