排序(一)__综述

一、排序基本概念

1、排序概念

假设含有n个记录的序列为{r1,r2,r3……rn},其相应的关键字分别为{k1,k2……kn},需确定1,2……n的一种排序p1,p2,……pn,使其相应的关键字满足kp1<=kp2<=……kpn非递减(或非递增)关系,即使得序列成为按关键字有序的序列{rp1,rp2……rpn},这样的操作称为排序。

注意:(1)通常将数据元素称为元素。

     (2)排序的依据是关键字之间的大小关系。

     (3)关键字ki可以是记录r的主关键字,也可以是次关键字,甚至是若干数据项的组合。

2、组合排序的问题

例:大学为了选拔在主学科上更优秀的学生,要求对所有学生的所有科目总分降序排序,并且在同样总分的情况下将语数外总分做降序排名。

编号 姓名 总分 语数外
1 令狐冲 85 60 84 86 89 94 87 83 85 753 229
2 郭靖 66 64 56 45 76 56 56 78 76 573 186
3 杨过 85 78 64 68 84 78 73 88 64 682 227
4 张无忌 84 85 67 90 87 83 94 79 84 753 236

分析:这就是对总分和语数外总分两个次关键字的组合排序。

解决方案一(比较土):对于组合排序问题,可以先排序总分,若总分相等的情况下,再排序语数外总分。

解决方案二(推荐):把总分与语数外都当成字符串首尾连接在一起(注意不足三位前面补零),很容易得到令狐冲的“753229”要小于张无忌的“753236”,于是张无忌就排在令狐冲的前面。

结论:从这个例子也可以看出,多个关键字的排序最终都可以转化为单个关键字的排序。

二、排序的稳定性

1、基本概念

假设ki=kj(1<=i<=n,1<=j<=n,i!=j),且在排序前的序列中ri领先于rj(即i<j)。如果排序后ri领先于rj,则称所用的排序算法是稳定的;反之,若可能使得排序后的序列中rj领先ri,则称所用的排序算法是不稳定的。

注意:(1)只要一组关键字实例不稳定,就可认为此排序方法不稳定。

(2)排序算法是否稳定,要通过分析才能得出。

2、举例分析

如下表经过对总分的降序排序后,总分高的排在前列。

编号 姓名 总分
1 令狐冲 753
2 郭靖 573
3 杨过 682
4 张无忌 753

此时对于令狐冲和张无忌而言,未排序时令狐冲在前,那么他们总分排序后,分数相等的令狐冲依然应该在前,这样才算稳定的排序。

编号 姓名 总分
1 令狐冲 753
4 张无忌 753
3 杨过 682
2 郭靖 573

如果他们两者颠倒了,则此排序是不稳定的。

编号 姓名 总分
4 张无忌 753
1 令狐冲 753
3 杨过 682
2 郭靖 573

三、排序的分类

1、内排序与外排序——待排序记录是否全部放置在内存中

内排序——在排序的整个过程中,待排序的所有记录全部被放置在内存中。

内排序排序算法性能的3个影响因素:

(1)时间性能——高效率的内排序算法应该是具有尽可能少的关键字比较次数和尽可能少的记录移动次数。

(2)辅助空间——执行算法需要的辅助存储空间

(3)算法复杂性——算法本身的复杂度不是算法的时间复杂度,算法太过复杂会影响排序的性能。

外排序——由于排序的记录个数太多,不能同时放置在内存,整个排序过程需要在内外存之间多次交换数据才能进行。

2、插入排序、交换排序、选择排序和归并排序——根据排序过程中借助的主要操作把内排序分为插入排序、交换排序、选择排序和归并排序

理论 计算复杂性理论…… 自适应排序……
交换排序 冒泡排序 快速排序
选择排序 选择排序 堆排序
插入排序 插入排序 希尔排序
归并排序 归并排序
分布排序 珠排序…… 桶排序……
并发排序 双调排序器 两两排序网络
混合排序 Spread排序…… 积木排序……
其他 拓扑排序

3、简单算法和改进算法——按照算法的复杂度

冒泡排序、简单选择排序和直接插入排序属于简单算法;希尔排序、堆排序、归并排序、快速排序属于改进算法。

四、排序常用到的结构和函数

1、排序用的顺序表结构

#define MAXSIZE 10 //用于排序数组个数的最大值,可根据需要修改

typedef struct

{

int r[MAXSIZE+1];//用于存储要排序数组,r[0]用作哨兵或临时变量

int length;//用于记录顺序表的长度

}

2、排序最常用的数组两元素的交换

void swap(SqList *L,int i,int j)//交换L中数组r下标为i和j的值

{

int temp=L->r[i];

L->r[i]=L->r[j];

L->r[j]=temp;

}

学习排序算法的目的更多并不是为了去在现实中编程排序算法,而是通过学习来提高我们编写算法的能力,以便于去解决更多复杂和灵活的应用性问题

排序(一)__综述

时间: 2024-10-09 17:55:48

排序(一)__综述的相关文章

排序(二)__冒泡排序、简单选择排序和直接插入排序

前面<排序(一)__综述>提到按照算法的复杂度分为简单算法和改进算法两大类,本文主要就简单算法中的冒泡排序.简单选择排序和直接插入排序进行通俗详细的解析. 一.冒泡排序 1.基本概念 冒泡排序是一种交换排序,它的基本思想是:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止.(动态图来自维基百科) 2.关键代码(优化之后) void BubbleSort(SqList *L) { int i,j; Status flag=TRUE;            //flag用作标记,避

搜索引擎网页排序算法

2.1基于词频统计——词位置加权的搜索引擎 利用关键词在文档中出现的频率和位置排序是搜索引擎最早期排序的主要思想,其技术发展也最为成熟,是第一阶段搜索引擎的主要排序技术,应用非常广泛,至今仍是许多搜索引擎的核心排序技术.其基本原理是:关键词在文档中词频越高,出现的位置越重要,则被认为和检索词的相关性越好. 1)词频统计 文档的词频是指查询关键词在文档中出现的频率.查询关键词词频在文档中出现的频率越高,其相关度越大.但当关键词为常用词时,使其对相关性判断的意义非常小.TF/IDF很好的解决了这个问

SQL Server审计功能入门:CDC(Change Data Capture)

介绍 SQL Server 2008引入了CDC(Change Data Capture),它能记录: 1. 哪些数据行发生了改变 2. 数据行变更的历史记录,而不仅仅是最终值. 跟CT(Change Tracking)相比,它通过作业实现异步变更跟踪(像事务复制),而CT是同步实现的.因此它对性能的影响较轻并且不会影响事务. 典型应用是在提取.传输和加载数据到其它数据源,就像图中的数据仓库. 实现 微软建议CDC结合快照快照隔离级别使用,可以避免读取变更数据与变更数据写入时的读写阻塞. 需要注

sqlserver cdc用法

SELECT top(10)  * from (SELECT  sys.fn_cdc_map_lsn_to_time([__$start_lsn])  'addtime',* FROM cdc.dbo_TM_Room_CT)awhere 0=0 列名 数据类型 说明 __$start_lsn binary(10) 更改提交的LSN.在同一事务中提交的更改将共享同一个提交 LSN 值. __$seqval binary(10) 一个事务内可能有多个更改发生,这个值用于对它们进行排序. __$ope

算法导论第八章__实现计数排序

计数排序:不须要比較就能得出排序的顺序__比如.本章的计数排序.基数排序.桶排序 比較排序:须要进行比較才干得出排序的顺序__比如,本章的堆排序.高速排序(本质是插入排序).插入排序 代码清单:计数排序__完美演绎下标的作用 public class Count_Sort { //接收须要排序的数组 private int[] A; //排序后的数组 private int[] B; //用于计数的数组 private int[] C; // 初始化 public Count_Sort(int[

排序算法综述

排序算法有很多种,本文主要介绍基本的排序算法和实现,并分析复杂度和稳定性. 一.Ο(n2)的算法 1.插入排序 插入排序十分好理解,在无序的数组中选择一个数值,插入到有序的数组当中,这个过程是稳定的.实现代码如下: 1 template <typename T> 2 void InsertionSort(vector<T> &arr){ 3 int i, j; 4 for (i = 1; i < arr.size(); i++) { 5 int temp = arr[

常见排序__总结

文章来自:http://www.iteye.com/topic/1129454 一.概括 1.冒泡排序 (1)基本思想:在一个序列元素中,比较相邻的两个数,如果相邻的数的顺序与想要输出的顺序相反就要进行交换,到序列末尾有序列中的最大值或者最小值在数组的一端. (2)实例: (3)优缺点 (4)性质 (5)Java代码实现 package sorts; public class 冒泡排序 { public static void main(String[] args) { int a[]={49,

linux 查看命令 ___软连接__大小排序 ___时间排序

(List列表)1. ls -L 查看软连接 (link) 2. ls -t 按时间进行文件的排序(time) 3. ls -R (recursion循环)将目录下所有的子目录的文件都列出来,相当于我们编程中的"递归"实现 4. ls -a 列出文件下所有的文件(all)包括以.开头的隐藏文件(linux下文件隐藏文件是以.开头的,如果存在..代表存在着父目录)5. ls -A 列出除了"."和".."以外的文件. 6. ls -S 以文件的大小

[java初探06]__排序算法的简单认识

今天,准备填完昨天没填的坑,将排序算法方面的知识系统的学习一下,但是在简单的了解了一下后,有些不知如何组织学习了,因为排序算法的种类,实在是太多了,各有优略,各有适用的场景.有些不知所措,从何开始. 最后按照常规思路,我将逐次从排序算法的了解,常用的几种排序算法的原理及实现,几种算法的对比以及适用场景.三个方面展开对排序算法的学习. 排序算法的基本了解 在我们学习一样知识,技术之前,首先我们应当对它有一个基本的了解,然后在了解的基础上逐渐深入学习. 在计算机科学与数学中,排序算法(Sorting