一些高级排序算法的Java实现

1. 快速排序

快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,另外其中涉及的分而治之的思想在程序设计中也是一个常用的技巧,因此它是需要认真学习的一个算法重点。快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。

1.1 算法分析:

1.先从数列中取出一个数作为基准数。
2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
3.再对左右区间重复第二步,直到各区间只有一个数。

对挖坑填数进行总结
1.i =L; j = R; 将基准数挖出形成第一个坑a[i]。
2.j–由后向前找比它小的数,找到后挖出此数填前一个坑a[i]中。
3.i++由前向后找比它大的数,找到后也挖出此数填到前一个坑a[j]中。 4.再重复执行2,3二步,直到i==j,将基准数填入a[i]中。

1.2 快速排序的核心算法

/*** 快速排序:通过将列表分区,然后对这两个分区进行递归式排序,从而完成对整个列表的排序* 快速排序的策略:* 【1】首先,选择一个列表元素作为作为分区元素。* 【2】分割该列表,使得小于该分区元素的所有元素位于该元素的左边,所有大于该分区元素的元素位于右边。* 【3】最后,将该快速排序策略(递归式)应用于两个分区。* @param data*/public static <T extends Comparable<? super T>> void quickSort(T[] data) {quickSortRec(data,0,data.length-1);}/*** 需要使用递归的快速排序* @param data* @param begin* @param end*/private static <T extends Comparable<? super T>> void quickSortRec(T[] data,int begin,int end) {if(begin<end){//int mid = AdjustArray(data, begin, end);//先成挖坑填数法调整data[]  int mid = partition(data, begin, end);//先成挖坑填数法调整data[]  quickSortRec(data, begin, mid - 1); // 递归调用  quickSortRec(data, mid + 1, end);  }}/*** 挖坑填数的快速排序的实现* @param data* @param begin* @param end* @return*/private static <T extends Comparable<? super T>> int AdjustArray(T[] data,int begin,int end) {int i = begin, j = end;  T x = data[begin]; //s[l]即s[i]就是第一个坑  ///由于是从小到达的排序算法///因此我们首先找一个比基准小的数放在当前的坑里while (i < j)  {  //从右向左找小于x的数来填s[i]   这是找小于基准数的过程while(i < j && data[j].compareTo(x)>0)  j--;    if(i < j)  {  data[i] = data[j]; //将s[j]填到s[i]中,s[j]就形成了一个新的坑  i++;  }  //------------------------------------------------------------------------------//// 从左向右找大于或等于x的数来填s[j]  这是找大于基准数的过程while(i < j && data[i].compareTo(x)<0)  i++;    if(i < j)  {  data[j] = data[i]; //将s[i]填到s[j]中,s[i]就形成了一个新的坑  j--;  }  }  //退出时,i等于j。将x填到这个坑中。  data[i] = x;      return i;}/*** 第二种分割方法的实现* @param data* @param min* @param max* @return*/private static <T extends Comparable<? super T>> int partition(T[] data,int min,int max) {T pa;int left,right;int mid = (min+max)/2;//将中点的data作为分割元素pa=data[mid];//将分割元素前置到min处      swap(data,mid,min);left=min;right=max;while(left<right){while(left<right&&data[left].compareTo(pa)<=0){left++;}while(data[right].compareTo(pa)>0){right--;}if(left<right)swap(data,left,right);}//分割点置回中间位置swap(data,min,right);return right;}

2. 归并排序

2.1 归并排序算法

归并排序是另一种递归排序算法,通过将列表递归式分成两半直至每一个列表都只含有一个元素,然后将这些子列表按照顺序重组,这样就完成了对列表的排序。
归并排序算法的总结:递归划分子列表合并的方式,子列表有序,然后归并到一个列表中完成对列表的归并排序。

2.2 归并排序算法实现

/*** 归并排序:归并排序是另一种递归排序算法,通过将列表递归式分成两半直至每一个列表都只含有一个元素,* 然后将这些子列表按照顺序重组,这样就完成了对列表的排序。* 策略:* 【1】首先将该列表分成两个大约相等的部分* 【2】对每一个部分列表递归调用其自身,* 【3】继续该列表的递归分解,直至达到该递归的基本情形,这是该列表被分割成长度为1的列表* @param data* @param min* @param max*/public static <T extends Comparable<? super T>> void mergeSort(T[] data,int min, int max) {if (min < max) {int mid = (min + max) / 2;mergeSort(data, min, mid);mergeSort(data, mid + 1, max);merge(data, min, mid, max);}}/*** Merges two sorted subarrays of the specified array.** @param data the array to be sorted* @param first the beginning index of the first subarray * @param mid the ending index fo the first subarray* @param last the ending index of the second subarray*/private static <T extends Comparable<? super T>> void merge(T[] data,int first, int mid, int last) {T[] temp = (T[]) (new Comparable[data.length]);int first1 = first, last1 = mid; // endpoints of first subarrayint first2 = mid + 1, last2 = last; // endpoints of second subarrayint index = first1; // next index open in temp array// Copy smaller item from each subarray into temp until one// of the subarrays is exhaustedwhile (first1 <= last1 && first2 <= last2) {if (data[first1].compareTo(data[first2]) < 0) {temp[index] = data[first1];first1++;} else {temp[index] = data[first2];first2++;}index++;}// Copy remaining elements from first subarray, if anywhile (first1 <= last1) {temp[index] = data[first1];first1++;index++;}// Copy remaining elements from second subarray, if anywhile (first2 <= last2) {temp[index] = data[first2];first2++;index++;}// Copy merged data into original arrayfor (index = first; index <= last; index++)data[index] = temp[index];}

3. 快排和归并的区别

快速排序和归并排序有点正好相反的意思。
我们以从小到达排序为例:
【1】快速排序的算法是首先执行找中心点,中间大两边小的分割开,然后不断的将列表规模变小,小的在左,大的在右的原则一直不变。这样慢慢的随着列表越变越小就能够实现全部有序。
【2】归并排序的算法是首先将列表递归的一份为二,知道每一个子列表只有一个元素,然后在就近将两个子列表有序合并,列表规模慢慢扩大,这就实现了局部有序到整体有序的过渡。

【3】总之,二者都是递归排序的有效实现,实质上的区别就是,在两个算法的实现过程中一个是先利用分割点通过比较修改表结构,然后再调用递归方法;另一个是先从分割点实现递归调用,然后通过比较实现有序合并。

转载于:https://www.cnblogs.com/mrzhang123/p/5365830.html

数据结构(Java)——查找和排序(3)相关推荐

  1. 数据结构(Java)——查找和排序(1)

    1.查找的定义 查找是这样一个过程,即在某个项目组中寻找某一指定目标元素,或者确定该组中并不存在该目标元素. 对其进行查找的项目的组有时也成为查找池.两种常见的查找方式:线性查找和二分查找.为了能够查 ...

  2. java 查找排序_数据结构(Java)——查找和排序(1)

    1.查找的定义 查找是这样一个过程,即在某个项目组中寻找某一指定目标元素,或者确定该组中并不存在该目标元素. 对其进行查找的项目的组有时也成为查找池. 两种常见的查找方式:线性查找和二分查找. 为了能 ...

  3. 数据结构:查找与排序

    查找 查找的基本概念 查找是指,在数据结构中寻找满足给定条件的数据元素,也成为检索或搜索 1.查找条件.查找操作和查找结果 查找条件:数据元素(包含关键字key). 查找操作:比较元素相等,T类的eq ...

  4. 数据结构(java版)SortedSeqList(排序顺序表)

    SortedSeqList(排序顺序表) 代码部分: public class SortedSeqList<T extends Comparable<? super T>> e ...

  5. 【数据结构】查找与排序

    文章目录 考点分析 顺序查找 折半查找 分块查找 散列表 散列函数的构造方法 处理冲突的方法 小结 八大排序 插入排序 希尔排序 简单选择排序 堆排序 冒泡排序 快速排序 归并排序 基数排序 考点分析 ...

  6. 数据结构之查找与排序

    查找 静态查找:查找时,只查找读取 顺序表上查找 无序表上查找,设置位置0为岗哨,从后往前查找,查找长度为(n+1)/2 有序表上查找,使用二分查找,平均查找长度为 log2(n+1)-1 索引顺序表 ...

  7. 数据结构Java版之排序算法(二)

    排序按时间复杂度和空间复杂度可分为 低级排序 和 高级排序 算法两种.下面将对排序算法进行讲解,以及样例的展示. 低级排序:冒泡排序.选择排序.插入排序. 冒泡排序: 核心思想,小的数往前移.假设最小 ...

  8. 数据结构java学生成绩排序_数据结构学习--Java简单排序

    冒泡排序需要元素每次遍历都从最底部向上冒泡,找到适合的位置后,该位置之后的元素继续向上冒,这样一趟排序结束后,将冒出最大或者最小值. 选择排序需要元素从0号位开始向上遍历一遍,并将最小值放到0号位上, ...

  9. java 内置排序函数_java排序函数

    7. 数组排序 函数:Arrays.sort(); [java] view pl... 在 caller 的实例中,将实现了 A 接口的对象的引用传给 caller,后调用 call()方法; 注意: ...

  10. 常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构)

    常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构) 数据结构和算法作为程序员的基本功,一定得稳扎稳打的学习,我们常见的框架底层就是各类数据 ...

最新文章

  1. request threaded-only IRQs with IRQF_ONESHOT【转】
  2. robot.txt 搜索引擎 蜘蛛爬虫 搜索规则
  3. centos mysql 设置_CentOS下MySql优化及安全设置centos
  4. elasticsearch 查询数据 | 分页查询
  5. TCP流量控制与拥塞控制区别
  6. Run-time system与虚拟机
  7. C语言单链表定义及各类操作
  8. 计算机二级c语言作弊技巧,计算机等级考试二级C语言题型分析及应试技巧(1)
  9. redis zset怎么排序_redis(set、zset)类型使用和使用场景
  10. java web 限下载速_JavaWeb实现文件上传与下载的方法
  11. SSM三大框架Spring
  12. Ubuntu安装mysql数据可视化工具
  13. 数据库学习纪要(十二):SQL Sever介绍-4
  14. 关于PostgreSQL软件安装后出现解决the application server could not be contect ed错误的方法
  15. 我深爱的Java,对不起,我出轨了!!!呸!渣男!
  16. 币图网以太坊开发实例_去中心化概念模型与架构设计
  17. 使用TL-WDN5200H无线网卡
  18. CSS - 禁止手机移动端网页缩放(meta)
  19. 当易方达张坤遇招商白酒侯昊
  20. mini2440 linux驱动程序,基于linux的mini2440 led驱动及应用程序

热门文章

  1. 借助Ehcache缓存框架实现对页面的缓存
  2. 匿名对象与非匿名对象的区别
  3. Windows中安装ElasticSearch(单机+集群+Kibana)
  4. ElasticSearch学习(三):配置与集群
  5. java图形化元件竖直排列_Java:图形化比较排序
  6. springmvc执行流程_SpringMVC
  7. 服务器文件夹变成自读,服务器终端改文件读写权限
  8. (day 44 - 滑动窗口 ) 剑指 Offer 53 - II. 0~n-1中缺失的数字
  9. c++ string replace_「Java学习」String,StringBuffer和StringBuilder的区别
  10. cpu顶盖怎么看步进_拆解报告|360AI音箱,深度硬件解析,带你看懂360智能音箱内部...