五、排序

1.冒泡排序

从动画可看出冒泡排序十分慢,为o(n^2)

2.归并排序

归并排序(MergeSort)的基本思想是:将待排序文件看成为n个长度为1的有序子文件,把这些子文件两两归并,使得到「n/2」个长度为2的有序子文件;然后再把这「n/2」个有序文件的子文件两两归并,如此反复,直到最后得到一个长度为n的有序文件为止,这种排序方法成为二路归并排序。例如,有初始关键字序列:72,18,53,36,48,31,36,其二路归并排序过程如下所示。

    n=7 [72] [18] [53] [36] [48] [31] [36]

   一趟归并: [18 72] [36 53] [31 48] [36]

   二趟归并: [18 36 53 72] [31 36 48]

   三趟归并: [18 31 36 36 48 53 72]

时间复杂度为O(nlogn) 这是该算法中最好、最坏和平均的时间性能。

空间复杂度为 O(n)

3.快速排序

快速排序的时间主要耗费在划分操作上,对长度为k的区间进行划分,共需k-1次关键字的比较。

最坏情况是每次划分选取的基准都是当前无序区中关键字最小(或最大)的记录,划分的结果是基准左边的子区间为空(或右边的子区间为空),而划分所得的另一个非空的子区间中记录数目,仅仅比划分前的无序区中记录个数减少一个。时间复杂度为O(n*n)

在最好情况下,每次划分所取的基准都是当前无序区的"中值"记录,划分的结果是基准的左、右两个无序子区间的长度大致相等。总的关键字比较次数:O(nlgn)

尽管快速排序的最坏时间为O(n2),但就平均性能而言,它是基于关键字比较的内部排序算法中速度最快者,快速排序亦因此而得名。它的平均时间复杂度为O(nlgn)。

4.堆排序

堆排序其实也是一种选择排序,是一种树形选择排序。只不过直接选择排序中,为了从R[1...n]中选择最大记录,需比较n-1次,然后从R[1...n-2]中选择最大记录需比较n-2次。事实上这n-2次比较中有很多已经在前面的n-1次比较中已经做过,而树形选择排序恰好利用树形的特点保存了部分前面的比较结果,因此可以减少比较次数。对于n个关键字序列,最坏情况下每个节点需比较log2(n)次,因此其最坏情况下时间复杂度为nlogn。堆排序为不稳定排序,不适合记录较少的排序。

代码:

1.冒泡排序:

for i:=1 to n do

for j;=i+1 to n do

if a[i]<a[j] then

begin

t:=a[i];

a[i]:=a[j];

a[j]:=t;

end;

2.归并排序

type

arr=array[1..100]of
longint;

var

i,n:longint;

a,b:arr;

procedure hb(s,m,n,t:longint);

var  i,l,j,k:longint;

begin

k:=s;
i:=s; j:=n;

while
(i<=m)and(j<=t) do

begin

if
a[i]<=a[j]

then
begin b[k]:=a[i];inc(i); end

else  begin
b[k]:=a[j];inc(j); end;

inc(k);

end;

for
l:=i to m do begin b[k]:=a[l]; inc(k) end;

for
l:=j to n do begin b[k]:=a[l]; inc(k) end;

for
l:=s to t do a[l]:=b[l];

end;

procedure gb(s,t:longint);

var

mid:longint;

begin

if
s<t

then

begin

mid:=(s+t)div
2;

gb(s,mid);
gb(mid+1,t);

hb(s,mid,mid+1,t);

end;

end;

begin

readln(n);

for
i:=1 to n do

read(a[i]);

gb(1,n);

for
i:=1 to n do

write(a[i],‘
‘);

end.

3.快速排序

procedure cha(l,r:longint);

var i,j,mid,t:longint;

begin

i:=l;

j:=r;

mid:=a[(l+r) div 2];

while i<=j do

begin

while a[i]>mid do inc(i);

while a[j]<mid do dec(j);

if (i<=j) then

begin

t:=a[i];

a[i]:=a[j];

a[j]:=t;

inc(i);

dec(j);

end;

end;

if j>l then cha(l,j);

if i<r then cha(i,r);

end;

4.堆排序

var a:array[1..10000]of longint;

n,i:longint;

temp:longint;

procedure heap(i,x:longint);

var temp:longint;

begin

while i*2<x do

begin

i:=i*2;

if (a[i]<a[i+1]) and (i+1<=x) then inc(i);

if a[i]>a[i div 2] then

begin

temp:=a[i];

a[i]:=a[i div 2];

a[i div 2]:=temp;

end else exit;

end;

end;

begin

randomize;

read(n);

for i:=1 to n do a[i]:=random(217470000);

for i:=n div 2 downto 1 do heap(i,n);

for i:=n downto 2 do

begin

temp:=a[i];

a[i]:=a[1];

a[1]:=temp;

heap(1,i-1);

end;

for i:=1 to n do writeln(a[i]);

end.

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-03 14:57:12

五、排序的相关文章

15. 蛤蟆的数据结构进阶十五排序实现之堆排序

15. 蛤蟆的数据结构进阶十五排序实现之堆排序 本篇名言:"谁要是游戏人生 ,他就一事无成 ; 谁不能主宰自己 ,永远是一个奴隶.--歌德" 继续来看下堆排序. 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/47733553 1.  堆排序 堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种.可以利用数组的特点快速定位指定索引的元素.堆分为大根堆和小根堆,是完全二叉树

python几种排序算法和二分查找方法的实现

一.算法概念 - 含义:算法就是对问题进行处理且求解的一种实现思路或者思想. 评判程序优劣的方法 - 消耗计算机资源和执行效率(无法直观) 计算算法执行的耗时(不推荐,因为会受机器和执行环境的影响) 时间复杂度(推荐) 时间复杂度 - 评判规则:量化算法执行的操作/执行步骤的数量, - 如下列 def sumOfN(n): # 执行一步: theSum = 0 for i in range(1,n+1): # 下式一共执行n步,for循环不算一步,因为它是控制循环次数的 theSum = the

LeetCode 刷题总结

最近找工作,免不了看CC150 刷 LeetCode 来练手,练习之余也向各路大神 系统并且深入的学习.巩固一下算法知识.一. 线性表1. 数组    Remove Duplicates from Sorted Array    Remove Duplicates from Sorted Array II    Search in Rotated Sorted Array    Search in Rotated Sorted Array II    Median of Two Sorted A

Hibernate-HQL查询

Hibernate-HQL查询 HQL是hibernate query language的缩写,这是一门面向对象的查询语言,也是hibernate中最常见的查询语言. (一)   HQL的基本语法     select "属性名" from "对象" where "条件" group by "属性名" having "分组条件" order by "属性名" desc/asc 注意事项

MySQL-with rollup函数运用 _20160930

在博客里http://www.cnblogs.com/Mr-Cxy/p/5898839.html提到了行转列, 如果想在下面这个表下面添加一行 总计 数据行SQL代码怎么实现 并且根据9月金额进行城市降序 总计置于底部呢 MySQL提供了 group by with rollup 函数进行group by 字段的汇总 但是order by 互斥的不能同时用 第一步还是是先计算各城市每个月的金额 SELECT b.城市,SUM(IF(b.年月=201607,b.金额,NULL)) AS 7月金额,

Scala从入门到精通之四-映射和元组

在Scala中映射之键值对的集合,元组是n个对象的聚集,但是对象的类型不一定相同 本节内容要点 Scala中映射的创建,遍历和查询 如何从可变和不可变映射中做出选择 Scala映射和Java映射见的互操作 Scala中元组的使用 一.构造映射 我们可以这样来构造一个映射: val scores = Map("ysl"->100,"wdd"->90) 上述代码构造一个不可变的Map[String,Int],其值不可以被改变.如果需要创建一个可变的映射,可以

04hive查询

详细文档查看:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Select 一. 基本查询(SELECT …FROM) 1. 全表和特定列查询 select * from emp: select empno, ename from emp; 注意: (1)SQL 语言大小写不敏感. (2)SQL 可以写在一行或者多行 (3)关键字不能被缩写也不能分行 (4)各子句一般要分行写. (5)使用缩进提高语句的可读性 列别名

用python+selenium获取北上广深成五地PM2.5数据信息并按空气质量排序

从http://www.pm25.com/shenzhen.html抓取北京,深圳,上海,广州,成都的pm2.5指数,并按照空气质量从优到差排序,保存在txt文档里 #coding=utf-8 from selenium import webdriver from time import sleep class PM: def __init__(self): self.dr = webdriver.Chrome() self.pm25_info = self.get_pm25_info() de

排序算法分析【五】:归并排序(附Python&amp;C++代码)

归并排序:将两个已经排序的串行合并成一个串行的操作. 算法原理 先看动态图: 算法描述如下: 申请空间,使其大小为两个已经排序串行之和,该空间用来存放合并后的串行: 设定两个指针,最初位置分别为两个已经排序串行的起始位置: 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置: 重复步骤3直到某一指针到达串行尾: 将另一串行剩下的所有元素直接复制到合并串行尾. 算法实现 Python版: #-*- encoding: utf-8 -*- def merge_sort(l

常见的五类排序算法图解和实现(多关键字排序:基数排序以及各个排序算法的总结)

基数排序思想 完全不同于以前的排序算法,可以说,基数排序也叫做多关键字排序,基数排序是一种借助“多关键字排序”的思想来实现“单关键字排序”的内部排序算法. 两种方式: 1.最高位优先,先按照最高位排成若干子序列,再对子序列按照次高位排序 2.最低位优先:不必分子序列,每次排序全体元素都参与,不比较,而是通过分配+收集的方式. 多关键字排序 例:将下表所示的学生成绩单按数学成绩的等级由高到低排序,数学成绩相同的学生再按英语成绩的高低等级排序.        第一个关键字是数学成绩,第二个关键字是英