排序——(冒泡,选择,插值)
2016-07-22 15:09
204 查看
假设含有n个记录的序列为(r1,r2,.......,rn),其相应的关键字分别为{k1,k2,......,kn},需确定1,2,.....,n的一种排列p1,p2,.......,pn,使其相应的关键字满足kp1<=kp2<=.......<=kpn(非递减或非递增)关系,即使得序列称为一个按关键字有序的序列(rp1,rp2,....rpn),这样的操作就称为排序。
假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,ri=rj,且ri在rj之前,而在排序后的序列中,ri仍在rj之前,则称这种排序算法是稳定的;否则称为不稳定的。
快速排序、希尔排序、堆排序、直接选择排序不是稳定的排序算法,而基数排序、冒泡排序、直接插入排序、折半插入排序、归并排序是稳定的排序算法。
①冒泡排序
它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
算法思路比较简单,常用的排序算法,冒泡排序就是把小的元素往前调或者把大的元素往后调。
原理是临近的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换,这样一趟过去后,最大或最小的数字被交换到了最后一位,忽略最后一位将剩下的序列重复上面的操作,直到只剩第一位为止。
②选择排序
选择排序(Selection
sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。
从所有序列中先找到最小(最大)的,然后放到第一个位置。之后再看剩余元素中最小(最大)的,放到第二个位置……知道序列末尾为止。
③插值排序
所谓插入排序法,就是检查第i个数字,如果在它的左边的数字比它大,进行交换,这个动作一直继续下去,直到这个数字的左边数字比它还要小,就可以停止了。
④希尔排序
参见另外一篇博客:希尔排序
⑤堆排序
参见另外一篇博客:堆排序
⑥快速排序
参见另外一篇博客:快速排序
⑦归并排序
参见另外一篇博客:归并排序
假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,ri=rj,且ri在rj之前,而在排序后的序列中,ri仍在rj之前,则称这种排序算法是稳定的;否则称为不稳定的。
快速排序、希尔排序、堆排序、直接选择排序不是稳定的排序算法,而基数排序、冒泡排序、直接插入排序、折半插入排序、归并排序是稳定的排序算法。
①冒泡排序
它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
算法思路比较简单,常用的排序算法,冒泡排序就是把小的元素往前调或者把大的元素往后调。
原理是临近的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换,这样一趟过去后,最大或最小的数字被交换到了最后一位,忽略最后一位将剩下的序列重复上面的操作,直到只剩第一位为止。
public static void bubbleSort(int[] arr) { for(int i=arr.length-1;i>0;i--) { for(int j=0;j<i;j++) { if(arr[j]>arr[j+1]) { arr[j+1]=arr[j+1]^arr[j]; arr[j]=arr[j+1]^arr[j]; arr[j+1]=arr[j+1]^arr[j]; } } } }
②选择排序
选择排序(Selection
sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。
从所有序列中先找到最小(最大)的,然后放到第一个位置。之后再看剩余元素中最小(最大)的,放到第二个位置……知道序列末尾为止。
public static void selectSort(int[] arr) { int midd; for(int i=0;i<arr.length-1;i++) { midd = i; for(int j=i+1;j<arr.length;j++) { if(arr[i]>arr[j]) { midd=j; } } if(midd!=i) { arr[i]=arr[i]^arr[midd]; arr[midd]=arr[i]^arr[midd]; arr[i]=arr[i]^arr[midd]; } } }
③插值排序
所谓插入排序法,就是检查第i个数字,如果在它的左边的数字比它大,进行交换,这个动作一直继续下去,直到这个数字的左边数字比它还要小,就可以停止了。
public static void insertSort(int arr[]) { int j; int temp; for(int i=1;i<arr.length;i++) { j=i-1; temp=arr[i]; while(j>=0 && temp<arr[j]) { arr[j+1]=arr[j]; j--; } arr[j+1]=temp; } }
④希尔排序
参见另外一篇博客:希尔排序
⑤堆排序
参见另外一篇博客:堆排序
⑥快速排序
参见另外一篇博客:快速排序
⑦归并排序
参见另外一篇博客:归并排序
相关文章推荐
- Python cx_Oracle 5.0 新特性概述
- mssql 置疑的处理
- Java并发编程:深入剖析ThreadLocal
- mini2451的nandflash配置详细过程
- JQuery事件绑定
- Canvas 学习之 (3) scale
- 1. Two Sum
- O365(世纪互联)SharePoint 之调查列表简单介绍
- O365(世纪互联)SharePoint 之使用列表库发布新闻
- O365(世纪互联)SharePoint 之使用Designer报错
- SharePoint 2016 配置向导报错 - The 'ListInternal' attribute is not allowed
- sharePoint 2016 弃用和删除的功能
- PHP开发:使用PHP抓取百万知乎用户以及知识点札记
- O365(世纪互联)SharePoint 之站点个性化
- O365(世纪互联)SharePoint 之文档库使用小记
- SharePoint 2016 图文安装教程
- SharePoint 2013 激活标题字段外的Menu菜单
- SharePoint 2013 定制搜索显示模板(二)
- 通关!游戏设计之道的学习笔记(一)电子游戏
- SharePoint 2013 搜索功能,列表项目不能完全被索引