排序小记【1】基本排序算法
前言:
说起来小学的时候老师讲冒泡排序,算是学的第一个排序算法(然并卵),不过我是不会写
然后某一天突然写出了这么个鬼
(那时候还是用pascal)
1 for i:=1 to n do 2 for j:=i+1 to n do 3 if (a[i]>a[j]) then 4 begin 5 tmp:=a[i]; 6 a[i]:=a[j]; 7 a[j]:=tmp; 8 end;
好像应该是最简单的排序,不知道是选择还是冒泡,反正O(n²)是跑不了的,大概唯一的优点就是码起来快吧。。。实测小于10,000的数据差不多可以放心用,可AC明明的随机数(排序入门题,3000的数据吧,无优化)
快排:
快排是真的强!!
快排的基本思路:对于一个区间(1,n)的待排数据,取其目前位于中间的数为轴,对于轴左边的分区(partition)和右边的分区逐个进行比较,(假设要排成升序好了)就把右边比轴小的扔左边去,把左边比轴大的扔到右分区
这样以后知道左右分区选取的数都选完了以后,进入两边没排好的分区重复上述操作,最后就排好了。
对于pascal选手来说,大家只说没有stl很苦逼,不过在Pascal安装目录下 /demo/text/ 中有 qsort.pp 伟大的快排入门
OI选手该记的sth:时间复杂度最好O(n log n) 平均O(n log n) 最差 O(n²)
1 var 2 data:array[0..100000]of longint; 3 table,n:longint; 4 5 procedure qsort(l,r:longint); 6 var 7 axis,i,j,temp:longint; 8 begin 9 i:=l; 10 j:=r; 11 axis:=data[(l+r)div 2]; 12 repeat 13 while data[i]<axis do 14 inc(i); 15 while data[j]>axis do 16 dec(j); 17 if i<=j then 18 begin 19 temp:=data[i]; 20 data[i]:=data[j]; 21 data[j]:=temp; 22 inc(i); 23 dec(j); 24 end; 25 until i>j; 26 if l<j then 27 qsort(l,j); 28 if i<r then 29 qsort(i,r); 30 end; 31 32 begin 33 readln(n); 34 for table:=1 to n do 35 read(data[table]); 36 qsort(1,n); 37 for table:=1 to n-1 do 38 write(data[table],' '); 39 writeln(data[n]); 40 end.
用c++以后随意改写了一下:
1 #include <cstdio> 2 3 using namespace std; 4 5 int n,a[100000]; 6 7 void qsort(int l,int r){ 8 int mid = a[(l + r) >> 1]; 9 int i = l,j = r; 10 do{ 11 while(a[i]<mid){ 12 i++; 13 } 14 while(a[j]>mid){ 15 j--; 16 } 17 if (i<=j){ 18 a[0] = a[i]; 19 a[i] = a[j]; 20 a[j] = a[0]; 21 i++; 22 j--; 23 } 24 }while(i<=j); 25 if (i<r){ 26 qsort(i,r); 27 } 28 if (l<j){ 29 qsort(l,j); 30 } 31 } 32 33 int main(int argc, char const *argv[]){ 34 scanf("%d",&n); 35 for (int i = 1; i <= n; ++i){ 36 scanf("%d",&a[i]); 37 } 38 qsort(1,n); 39 for (int i = 1; i < n; ++i){ 40 printf("%d ", a[i]); 41 } 42 printf("%d\n", a[n]); 43 return 0; 44 }
对于这个code,可能有点意思的是do-while 毕竟平时用的不多,搞得我不得不阅读一下语法说明 真是涨姿势了
之后嘛 作为新cpp选手,stl一定要搞一下的
经机房的苦力老师简单介绍一下以后,写了这么个东西(雾):
1 #include <algorithm> 2 #include <cstdio> 3 4 using namespace std; 5 6 int n,a[100000]; 7 8 bool cmp(int a,int b){ 9 return a<b; 10 } 11 12 int main(int argc, char const *argv[]){ 13 scanf("%d",&n); 14 for (int i = 1; i <= n; ++i){ 15 scanf("%d",&a[i]); 16 } 17 sort(a+1,a+n,cmp); 18 for (int i = 1; i < n; ++i){ 19 printf("%d ", a[i]); 20 } 21 printf("%d\n", a[n]); 22 return 0; 23 }
然而。。。
我:***
那么哪里错了呢?
显然sort写错了QAQ
1 #include <algorithm> 2 #include <cstdio> 3 4 using namespace std; 5 6 int n,a[100000]; 7 8 bool cmp(int a,int b){ 9 return a<b; 10 } 11 12 int main(int argc, char const *argv[]){ 13 scanf("%d",&n); 14 for (int i = 1; i <= n; ++i){ 15 scanf("%d",&a[i]); 16 } 17 sort(a+1,a+n+1,cmp); 18 for (int i = 1; i < n; ++i){ 19 printf("%d ", a[i]); 20 } 21 printf("%d\n", a[n]); 22 return 0; 23 }
标红的才是正解
归纳一下,如果待排数组是a,数据是a[0]到a[n-1],则写作sort(a,a+n,cmp);如果是a[1]到a[n],就是sort(a+1,a+n+1,cmp);
(好像sort默认升序?那就不用写cmp)
新姿势:
include一下functional以后,sort的算子可以使用以下内容:equal_to<Type>、not_equal_to<Type>、greater<Type>、greater_equal<Type>、less<Type>、less_equal<Type>
怎么用顾名思义,再不会google去。。。
比方说降序排序,写作sort(a+1,a+n+1,greater<int>());就好
总之 stl 的 sort应该是普遍情况下最好的排序算法了,据说是快排接插入排序。
转载于:https://www.cnblogs.com/mojibake/p/7745037.html
排序小记【1】基本排序算法相关推荐
- java算法----排序----(6)希尔排序(最小增量排序)
1 package log; 2 3 public class Test4 { 4 5 /** 6 * java算法---希尔排序(最小增量排序) 7 * 8 * @param args 9 */ 1 ...
- pandas对dataframe进行排序:单数据列排序、多数据列排序、NA值排序位置、排序算法
pandas对dataframe进行排序:单数据列排序.多数据列排序.NA值排序位置.排序算法 目录 pandas对dataframe进行排序 #仿真数据 #基于单数据列进行dataframe排序
- 输入法按照选字频率排序的C语言程序算法,算法与数据结构之选择排序(C语言)...
#include #include void SelectSort(int *a,int n);//预声明要调用的函数 int main(void) { int k; int x[]={,,,,,,, ...
- ef 排序string转int_排序算法之基本排序算法
基本排序算法 选择排序 选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未 ...
- php三个数字比较大小排序,php中常用的4种实现数字大小排序的冒泡选择等算法函数代码...
分别用冒泡排序法,快速排序法,选择排序法,插入排序法将下面数组中按照从小到大的顺序进行排序. 本站收录这篇文章php中常用的4种实现数字大小排序的冒泡选择等算法函数代码,详细解说文章中相关排序 冒泡 ...
- C++使用Merge Sort排序计数反转的实现算法(附完整源码)
C++使用Merge Sort排序计数反转的实现算法 C++使用Merge Sort排序计数反转的实现算法完整源码(定义,实现,main函数测试) C++使用Merge Sort排序计数反转的实现算法 ...
- 算法导论-排序(四)计数排序(线性时间排序)
目录 1.计数排序介绍 2.流程图 3.代码实现 4.性能分析 5.参考资料 内容 1.计数排序介绍 什么是计数排序? 计数排序是一种特殊的排序算法,之前介绍的排序算法需要对数进行两两比较,效率下界为 ...
- 排序算法——希尔排序(缩小增量排序)
1.希尔排序思想: 希尔排序就是把数据分成若干份子序列,从第一个元素开始,和每间隔为n的元素分成一个子序列,对每一份子序列实行直接插入排序,然后合并成一个新序列,继续对新序列以间隔m分成若干份,继续重 ...
- C++实现桶排序——十大经典排序算法之九【GIF动画+完整代码+详细注释】
十大经典排序算法系列博客-->传送门 桶排序是计数排序的升级版.它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定.桶排序 (Bucket sort)的工作的原理:假设输入数据服从均 ...
- 合并排序算法排序过程_合并排序| 用于大型输入的最佳排序算法之一
合并排序算法排序过程 What is sorting? 什么是分类? Sorting allows us to process our data in a more organized and eff ...
最新文章
- java后台的微信小程序支付的解决方案
- HTML5新增标签与属性
- 遗传算法解决排序问题
- 第三章:3.6 典型信号傅里叶变换
- 这一次彻底搞懂 Git Rebase
- PowerShell在Exchange2010下快速创建动态通讯组
- the c programming language_C.I. 直接黄4(C.I. 24890)生产工艺。 CAS号 [3051114]
- [转]localCache与集中式cache
- 关于C#winform程序运行无异常,在生成安装文件安装后提示水晶报表加载失败,系统找不到指定的路径的解决方法...
- 黑洞时间公式,为根号内为负是什么意思
- java ojdbc14 查询数据表,Oracle10g JDBC ojdbc14 DATE类型hibernate查询时分秒问题
- scMRA:一种健壮的深度学习方法,可以用多个参考数据集注释scRNA-seq数据
- matlab 添加文本框textbox
- POP3 SMTP 协议分析学习笔记
- 热烈欢迎Ubuntu志愿者!
- 网络/运维工程面试题汇总二
- 【毕业设计/课程设计】基于opencv的高精度人脸识别考勤系统设计与实现
- 速途研究院联合融云:中国移动社交沟通指数报告
- 【ML】KNN 原理 + 实践(基于sklearn)
- flash +asp.net +fcs实现视频聊天