09-排序1 排序 (25 分)
Posted keiiha
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了09-排序1 排序 (25 分)相关的知识,希望对你有一定的参考价值。
给定N个(长整型范围内的)整数,要求输出从小到大排序后的结果。
本题旨在测试各种不同的排序算法在各种数据情况下的表现。各组测试数据特点如下:
- 数据1:只有1个元素;
- 数据2:11个不相同的整数,测试基本正确性;
- 数据3:103个随机整数;
- 数据4:104个随机整数;
- 数据5:105个随机整数;
- 数据6:105个顺序整数;
- 数据7:105个逆序整数;
- 数据8:105个基本有序的整数;
- 数据9:105个随机正整数,每个数字不超过1000。
输入格式:
输入第一行给出正整数N(≤105),随后一行给出N个(长整型范围内的)整数,其间以空格分隔。
输出格式:
在一行中输出从小到大排序后的结果,数字间以1个空格分隔,行末不得有多余空格。
输入样例:
11 4 981 10 -17 0 -20 29 50 8 43 -5
输出样例:
-20 -17 -5 0 4 8 10 29 43 50 981
测试排序算法的性能
程序主体
#include <iostream> #include <vector> #include <algorithm> using namespace std; int main(){ int n; cin >> n; vector<int> arr(n); for(int i=0;i<n;i++){ scanf("%d",&arr[i]); } //排序算法 printf("%d",arr[0]); for(int i=1;i<n;i++){ printf(" %d",arr[i]); } printf("\\n"); return 0; }
首先是库函数 sort();
快排 严蔚敏版
int partition(vector<int> &arr,int left,int right){ int pivot=arr[left]; while(left<right){ while(left<right&&arr[right]>=pivot)--right; arr[left]=arr[right]; while(left<right&&arr[left]<=pivot)++left; arr[right]=arr[left]; } arr[left]=pivot; return left; } void quickSort(vector<int> &arr,int left,int right){ if(left<right){ int pivotPos=partition(arr, left, right); quickSort(arr, left, pivotPos-1); quickSort(arr, pivotPos+1, right); } }
pivot主元的选取默认了最左侧的第一个元素, 对效率会有很大的影响
可以看到在数据量 10^4以内保持良好的效率 在达到10^5数据时 耗时增长速度极大的超过了数据增长速度
在顺序数据中效率达到最差, 因此 基本有序的数据 和 大量数据不适合用快排
直接插入排序
void insertSort(vector<int> &arr,int n){ int temp; scanf("%d",&arr[0]);//插入第一个元素 for(int i=1;i<n;i++){ scanf("%d",&arr[i]); if(arr[i]<arr[i-1]){//如果比队尾值要小 则插入队列中 temp=arr[i]; int j; for(j=i;arr[i]<arr[j-1]&&j>0;j--); for(int k=i;k>j;k--){//比arr[i]大的元素都后移一位 arr[k]=arr[k-1]; } //最终j停止位置就是要插入的位置 arr[j]=temp; } } }
在数据基本有序的情况下, 直接插入效率接近库函数,在数据无序的情况下比快排慢一些, 逆序数据效率达到最差 接近超时
以上是关于09-排序1 排序 (25 分)的主要内容,如果未能解决你的问题,请参考以下文章
PTA 09-排序2 Insert or Merge (25分)
PTA 09-排序3 Insertion or Heap Sort (25分)