复习之余,就将数据结构中关于排序的这块知识点整理了一下,写下来是想与更多的人分享,最关键的是做一备份,为方便以后查阅。

排序

1、概念:

有n个记录的序列{R1,R2,.......,Rn}(此处注意:1,2,n 是下表序列,以下是相同的作用),其相应关键字的序列是{K1,K2,.........,Kn}。通过排序,要求找出当前下标序列1,2,......,n的一种排列p1,p2,........pn,使得相应关键字满足如下的非递减(非递增)关系,即:Kp1<=Kp2<=Kpn,这样就得到一个按关键字有序的记录序列:{Rp1,Rp2,.......,Rpn}。

2、分类

根据排序时数据所占用存储器的不同,可将排序分为两类。

内部排序:整个排序过程完全在内存中进行,如下:

插入类排序(直接插入排序、折半插入排序、希尔排序);

交换类排序(冒泡排序、快速排序);

选择类排序(简单选择排序、树型选择排序、堆排序);

归并排序;

分配类排序(多关键字排序、链式基数排序、基数排序的顺序表实现));

外部排序:由于待排序记录数据量太大,内存无法容纳全部数据,排序需要借助外部存储设备才能完成(磁盘排序,磁带排序)。

3、稳定性

假设在待排序的序列中存在多个具有相同关键字的记录。设Ki=Kj(1<=i<=n,1<=j<=n,i != j),若在排序前的序列中Ri领先与Rj(即i<=j),经过排序后得到的序列中Ri仍然领先与Rj,则称所用的排序方法是稳定的;反之,当相同关键字的领先关系在排序过程中发生变化,则所用的排序方法是不稳定的。

插入排序:

思想:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中的适当位置,直到全部记录插入完成为止。

直接插入排序:

算法思想:假设待排序的记录存放在数组R[1..n]中。初始时,R[1]自成1个有序区,无序区为R[2..n]。从i=2起直至i=n为止,依次将R[i]插入当前的有序区R[1..i-1]中,生成含n个记录的有序区。

用java实现的代码如下:

package exp_sort;public class DirectInsertSort {public static void DircstSort(int array[]) {int j;// 循环从第二个数开始,第一个数用做存放待插入的记录for (int i = 1; i < array.length; i++) {int temp = array[i];// 寻找插入位置for (j = i; j > 0 && temp < array[j - 1]; j--) {array[j] = array[j - 1];}// 将待插入记录插入到已经排序的序列中array[j] = temp;}for (int i = 0; i < array.length; i++) {System.out.print(array[i] + " ");}System.out.println("\n");}public static void main(String[] args) {// TODO Auto-generated method stubint array[] = { 38, 62, 35, 77, 55, 14, 35, 98 };DircstSort(array);}}

算法分析:最好的情况是待排序记录本身已经按照关键字有序排列,最坏的情况是待排序记录是按照关键字逆序排列的; 时间复杂度是O(N^2),空间复杂度是O(1);该算法是 稳定的排序算法:比较适用于 待排序记录数目较少且基本有序的情况。

折半插入排序:

算法思想:对于有序表进行折半查找,其性能优于顺序查找。

算法实现代码如下:

package exp_sort;public class BinaryInsertSort {public static void sort(int array[]) {int temp, low, mid, high;for (int i = 1; i < array.length; i++) {temp = array[i];low = 0;high = i -1;//确定插入位置while (low <= high) {mid = (low + high) / 2;if (temp < array[mid]) {high = mid - 1;} else {low = mid + 1;}}//记录依次向后移动for (int j = i; j >= low + 1; j--) {array[j] = array[j-1];}//插入记录array[low] = temp;}for (int i = 0; i < array.length; i++) {System.out.print(array[i] + " ");}System.out.println("\n");}public static void main(String[] args) {// TODO Auto-generated method stubint array[] = {38, 62, 35, 77, 55, 14, 35, 98};sort(array);}}

算法分析:是一种 稳定的排序算法,比直接插入算法明显减少了关键字之间比较的次数,因此 速度比直接插入排序算法快,但记录移动的次数没有变,所以折半插入排序算法的时间复杂度仍然为O(n^2),与直接插入排序算法相同。附加空间O(1)。

数据结构排序系列详解之一 插入排序相关推荐

  1. 数据结构排序系列详解之七 归并排序

    在前面说的那几种排序都是将一组记录按关键字大小排成一个有序的序列,而归并排序的思想是:基于合并,将两个或两个以上有序表合并成一个新的有序表 归并排序算法:假设初始序列含有n个记录,首先将这n个记录看成 ...

  2. 数据结构排序系列详解之二 希尔排序

    接着上一篇博客,这篇要介绍的是希尔排序(缩小增量排序法). 希尔排序:通过比较相距一定间隔的元素来工作:各趟比较所用的距离(增量)随着算法的进行而减小,直到只比较相邻元素的最后一趟排序为止.是插入排序 ...

  3. 数据结构排序系列详解之六 树形选择排序

    这篇博客接着来说说选择类排序之一的排序:树形选择排序 在简单选择排序中,每次的比较都没有用到上次比较的结果,所以比较操作的时间复杂度是O(N^2),想要降低比较的次数,则需要把比较过程中的大小关系保存 ...

  4. 数据结构排序系列详解之五 简单选择排序

    在前面的博客中已经讲述了交换类的排序算法,这节中开始说说选择类的排序算法了,首先来看一下选择排序的算法思想: 选择排序的基本算法思想: 每一趟在 n-i+1 (i=1,2,3,--,n-1)个记录中选 ...

  5. 数据结构排序系列详解之四 快速排序

    交换类排序的另一个方法,即快速排序. 快速排序:改变了冒泡排序中一次交换仅能消除一个逆序的局限性,是冒泡排序的一种改进:实现了一次交换可消除多个逆序.通过一趟排序将要排序的数据分割成独立的两部分,其中 ...

  6. 数据结构排序系列详解之三 冒泡排序

    前面两篇博客讲述的排序算法都是基于插入类的排序,这篇文章开始介绍交换类的排序算法,即:冒泡排序.快速排序(冒泡排序的改进). 交换类的算法:通过交换逆序元素进行排序的方法. 冒泡排序:反复扫描待排序记 ...

  7. java二分排序法原理_Java常见排序算法详解—— 二分插入排序

    转载请注明出处: 二分插入排序Binary Insert Sort 概念: 二分(折半)插入排序是一种在直接插入排序算法上进行小改动的排序算法.其与直接排序算法最大的区别在于查找插入位置时使用的是二分 ...

  8. 常见排序算法详解(插入排序、希尔排序、选择排序、冒泡排序、快速排序)

    1.1 插入排序 步骤: 1.从第一个元素开始,该元素可以认为已经被排序 2.取下一个元素tem,从已排序的元素序列从后往前扫描 3.如果该元素大于tem,则将该元素移到下一位 4.重复步骤3,直到找 ...

  9. 用数据结构c语言写成绩排序,C语言数据结构 快速排序实例详解

    C语言数据结构 快速排序实例详解 一.快速排序简介 快速排序采用分治的思想,第一趟先将一串数字分为两部分,第一部分的数值都比第二部分要小,然后按照这种方法,依次对两边的数据进行排序. 二.代码实现 # ...

最新文章

  1. debug.keystore not found for signing config 'debug'.
  2. linux下用c 开发web,用C一步步开发web服务器(2)
  3. Python 进程之间共享数据(全局变量)
  4. qt LNK2019 无法解析的外部符号
  5. 的boc调制matlab程序_Matlab仿真基础数字全息
  6. python使用字典格式化字符串-Python字符串格式方式 %s format()
  7. 【Android 应用开发】Google 官方 EasyPermissions 权限申请库 ( 最简单用法 | 一行代码搞定权限申请 | 推荐用法 )
  8. (转载)一套完整的UI设计规范手册(IOS版)
  9. java 结构体_Java实现单链表的简单操作
  10. 读书笔记_Effective_C++_条款十九:设计class犹如设计type
  11. JEECG - 基于代码生成器的J2EE智能开发框架 续一:开发环境搭建步骤
  12. 使用maven工具无法进入debug
  13. ue4 怎么传递变量到另一个蓝图_UE4中用Niagara实现procedural浪花
  14. 贪吃蛇c语言代码 链表,链表贪吃蛇 附代码
  15. 冯乐乐之六,基础光照模型
  16. Paypal 与Moneybookers
  17. 手机CPU天梯图2021年6月版
  18. tk教主:个人成长_网络成长时:浏览器的故事
  19. sed正则表达式替换字符方法
  20. C/S软件架构设计模式

热门文章

  1. cass参考手册_CASS9.2参考手册
  2. python版本可执行可嵌入_Python程序打包成exe可执行文件的方法探究
  3. C# 子类实例化基类 基类使用不了子类的方法_C#中的类、方法和属性
  4. s2sh框架搭建mysql_S2SH项目框架搭建(完全注解)
  5. gvim 命令行粘贴_vi/vim复制粘贴命令
  6. 精确率、召回率、F1 值、ROC、AUC
  7. 运行loadrunner自带的webtour项目无法启动
  8. 软件测试必学之python+unittest+requests+HTMLRunner编写接口自动化测试集
  9. linux ntp端口 修改,Linux时间配置(修改时间 修改日期 ntpd ntpdate NTP socket exiting)...
  10. java语言程序设计期中考试_《java语言程序设计》期中试卷(答案).doc