前言:

说起来小学的时候老师讲冒泡排序,算是学的第一个排序算法(然并卵),不过我是不会写

然后某一天突然写出了这么个鬼

(那时候还是用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】基本排序算法相关推荐

  1. java算法----排序----(6)希尔排序(最小增量排序)

    1 package log; 2 3 public class Test4 { 4 5 /** 6 * java算法---希尔排序(最小增量排序) 7 * 8 * @param args 9 */ 1 ...

  2. pandas对dataframe进行排序:单数据列排序、多数据列排序、NA值排序位置、排序算法

    pandas对dataframe进行排序:单数据列排序.多数据列排序.NA值排序位置.排序算法 目录 pandas对dataframe进行排序 #仿真数据 #基于单数据列进行dataframe排序

  3. 输入法按照选字频率排序的C语言程序算法,算法与数据结构之选择排序(C语言)...

    #include #include void SelectSort(int *a,int n);//预声明要调用的函数 int main(void) { int k; int x[]={,,,,,,, ...

  4. ef 排序string转int_排序算法之基本排序算法

    基本排序算法 选择排序 选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未 ...

  5. php三个数字比较大小排序,php中常用的4种实现数字大小排序的冒泡选择等算法函数代码...

    分别用冒泡排序法,快速排序法,选择排序法,插入排序法将下面数组中按照从小到大的顺序进行排序. 本站收录这篇文章php中常用的4种实现数字大小排序的冒泡选择等算法函数代码,详细解说文章中相关排序 冒泡 ...

  6. C++使用Merge Sort排序计数反转的实现算法(附完整源码)

    C++使用Merge Sort排序计数反转的实现算法 C++使用Merge Sort排序计数反转的实现算法完整源码(定义,实现,main函数测试) C++使用Merge Sort排序计数反转的实现算法 ...

  7. 算法导论-排序(四)计数排序(线性时间排序)

    目录 1.计数排序介绍 2.流程图 3.代码实现 4.性能分析 5.参考资料 内容 1.计数排序介绍 什么是计数排序? 计数排序是一种特殊的排序算法,之前介绍的排序算法需要对数进行两两比较,效率下界为 ...

  8. 排序算法——希尔排序(缩小增量排序)

    1.希尔排序思想: 希尔排序就是把数据分成若干份子序列,从第一个元素开始,和每间隔为n的元素分成一个子序列,对每一份子序列实行直接插入排序,然后合并成一个新序列,继续对新序列以间隔m分成若干份,继续重 ...

  9. C++实现桶排序——十大经典排序算法之九【GIF动画+完整代码+详细注释】

    十大经典排序算法系列博客-->传送门 桶排序是计数排序的升级版.它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定.桶排序 (Bucket sort)的工作的原理:假设输入数据服从均 ...

  10. 合并排序算法排序过程_合并排序| 用于大型输入的最佳排序算法之一

    合并排序算法排序过程 What is sorting? 什么是分类? Sorting allows us to process our data in a more organized and eff ...

最新文章

  1. java后台的微信小程序支付的解决方案
  2. HTML5新增标签与属性
  3. 遗传算法解决排序问题
  4. 第三章:3.6 典型信号傅里叶变换
  5. 这一次彻底搞懂 Git Rebase
  6. PowerShell在Exchange2010下快速创建动态通讯组
  7. the c programming language_C.I. 直接黄4(C.I. 24890)生产工艺。 CAS号 [3051114]
  8. [转]localCache与集中式cache
  9. 关于C#winform程序运行无异常,在生成安装文件安装后提示水晶报表加载失败,系统找不到指定的路径的解决方法...
  10. 黑洞时间公式,为根号内为负是什么意思
  11. java ojdbc14 查询数据表,Oracle10g JDBC ojdbc14 DATE类型hibernate查询时分秒问题
  12. scMRA:一种健壮的深度学习方法,可以用多个参考数据集注释scRNA-seq数据
  13. matlab 添加文本框textbox
  14. POP3 SMTP 协议分析学习笔记
  15. 热烈欢迎Ubuntu志愿者!
  16. 网络/运维工程面试题汇总二
  17. 【毕业设计/课程设计】基于opencv的高精度人脸识别考勤系统设计与实现
  18. 速途研究院联合融云:中国移动社交沟通指数报告
  19. 【ML】KNN 原理 + 实践(基于sklearn)
  20. flash +asp.net +fcs实现视频聊天

热门文章

  1. 「TJOI 2013」攻击装置
  2. Django之Form组件补充
  3. 案例33-用户退出功能
  4. Python3 中使用sys.argv详解
  5. 面向对象分析与设计阅读笔记一
  6. 顺序右移数组元素(内测第0届第5题)
  7. css3 实现图片旋转
  8. hdu 4057(ac自动机+状态压缩dp)
  9. css 文本两端对齐终极解决方案--一丝冰凉
  10. awakeFromNib 与 viewDIdLoad 自己小结