package cn.leilei.algorithm;public class Sort {/*** 内部排序算法* 插入排序类:直接插入排序,希尔排序* 选择排序类:选择排序,堆排序* 交换排序类:冒泡排序,快速排序* 归并排序*//*** 交换数组中的两个元素* 方法名:swap<BR>* 创建人:潭州学院-liuchao <BR>* 时间:2015年8月22日-下午10:03:19 <BR>* @param a* @param i* @param j* @return void<BR>* @exception <BR>* @since  1.0.0*/public static void swap(int[] a,int i,int j){int t;t=a[i];a[i]=a[j];a[j]=t;}/****************稳定的*****************//*** 基本冒泡排序 * 方法名:bubbleSort<BR>* 时间复杂度: O(n^2)* 创建人:潭州学院-liuchao <BR>* 时间:2015年8月22日-下午10:03:19 <BR>* @param a* @return void<BR>* @exception <BR>* @since  1.0.0*/public static void bubbleSort(int[] a){for(int i=a.length-1; i > 0 ; i--){for(int j=0; j < i ;j++){if(a[j] > a[j+1])swap(a,j,j+1);}}}/*** 改进冒泡排序 (不做无用功)* 方法名:bubbleSortII<BR>* 时间复杂度: O(n^2)* 创建人:潭州学院-liuchao <BR>* 时间:2015年8月22日-下午10:03:19 <BR>* @param a* @return void<BR>* @exception <BR>* @since  1.0.0*/public static void bubbleSortII(int[] a){boolean flag=false;for(int i=0; i < a.length-1&&!flag ; i++){//只有在没有排序的情况下,才继续循环flag=true;//设定排序标志for(int j=0; j < a.length-1-i ;j++){if(a[j] > a[j+1]){flag=false;//如果是没有排序,就重新设定标志swap(a,j,j+1);}}}}/*** 改进冒泡排序 (记录犯罪现场)* 方法名:bubbleSortIII<BR>* 时间复杂度: O(n^2)* 创建人:潭州学院-liuchao <BR>* 时间:2015年8月22日-下午10:03:19 <BR>* @param a* @return void<BR>* @exception <BR>* @since  1.0.0*/public static void bubbleSortIII(int[] a){int m=a.length-1;int k,j;while(m>0){for(k=0,j=0;j < m;j++){if(a[j] > a[j+1]){swap(a,j,j+1);k = j;//记录交换位置}}m = k;//记录最后一个交换的位置}}/*** 鸡尾酒排序  (双向的冒泡排序)* 方法名:cocktailSort<BR>* 时间复杂度: O(n^2)* 创建人:潭州学院-liuchao <BR>* 时间:2015年8月22日-下午10:03:19 <BR>* @param a* @return void<BR>* @exception <BR>* @since  1.0.0*/public static void cocktailSort(int[] a){for(int i = 0 ; i < a.length/2 ; i++){//将最小值排到队头for(int j = i ; j < a.length-i-1 ; j++){if(a[j] > a[j+1])swap(a,j,j+1);}//将最大值排到队尾for(int j = a.length-1-(i+1); j > i ; j--){if(a[j] < a[j-1])swap(a,j,j+1);}}}/*** 直接插入排序* 方法名:insertSort<BR>* 时间复杂度: O(n^2)* 创建人:潭州学院-liuchao <BR>* 时间:2015年8月22日-下午10:03:19 <BR>* @param a* @return void<BR>* @exception <BR>* @since  1.0.0*/public static void insertSort(int[] a){int i,j;for (i = 1; i < a.length; i++) {if(a[i] < a[i-1]){int temp=a[i];//待插入元素for (j = i-1; j>=0 && a[j]>temp; j--) {a[j+1]=a[j];//将大于temp的往后挪一位}a[j+1]=temp;}}}/*** 归并排序(递归型)* 方法名:mergeSort<BR>* 时间复杂度: O(nlogn)* 创建人:潭州学院-liuchao <BR>* 时间:2015年8月22日-下午10:03:19 <BR>* @param a:待排序数组* @return void<BR>* @exception <BR>* @since  1.0.0*/public static void mergeSort(int[] a){int[] temp=new int[200];   //临时数组存放排序结果merge_Sort(a,temp,0,a.length-1);} public static void merge_Sort(int[] a,int[] temp, int first, int last){if(first == last) //递归结束条件:当分组后只有一个数据时,表示有序,递归结束temp[first]=a[first];else{int mid=(first+last)/2;//分组merge_Sort(a,temp,first,mid);//递归将左边归并为有序merge_Sort(a,temp,mid+1,last);//递归将右边归并为有序mergeDo(a,temp,first,mid,last);//合并有序序列}}public static void mergeDo(int[] a, int[] temp,int first, int mid, int last){int i=first,j=mid+1;int m=mid,n=last;int k=0;while(i<=m && j<=n){if(a[i] <= a[j])//依次比较两个序列的数,谁小取谁,将a中数据从小到大并入temp中temp[k++] = a[i++];elsetemp[k++] = a[j++];}while(i <= m) //将剩余的a[i..m]并入到temp中temp[k++] = a[i++];while(j <= n) //将剩余的a[j..n]并入到temp中temp[k++] = a[j++];for(i=0;i<k;i++) //最后将合并后数组temp复制给aa[first+i] = temp[i];}/*** 归并排序(非递归型)* 方法名:mergeSortII<BR>* 时间复杂度: O(nlogn)* 创建人:潭州学院-liuchao <BR>* 时间:2015年8月22日-下午10:03:19 <BR>* @param a:待排序数组* @return void<BR>* @exception <BR>* @since  1.0.0*/public static void mergeSortII(int[] a){int[] temp=new int[200];   //临时数组存放排序结果for(int k=1;k < a.length;k = 2*k)merge_SortII(a,temp,k,a.length);//将a中相邻长度为k的子序列两两归并}public static void merge_SortII(int[] a, int[] temp,int s,int n){//s:子序列长度,n:数组大小int i;for(i=0;i <= n-2*s;i+=2*s)mergeDo(a,temp,i,i+s-1,i+2*s-1);//两两归并if(i<n-s)//归并剩下的最后两个序列(数组可能不会正好被平分)mergeDo(a,temp,i,i+s-1,n-1);}/*** 基数排序* 方法名:radixSort<BR>* 时间复杂度: O(n^k)* 创建人:潭州学院-liuchao <BR>* 时间:2015年8月22日-下午10:03:19 <BR>* @param a* @return void<BR>* @exception <BR>* @since  1.0.0*/public static void radixSort(int[] a, int d){ //d表示最大的数有多少位int k = 0;int n = 1;int m = 1; //控制键值排序依据在哪一位int[][] temp = new int[10][a.length]; //数组的第一维表示可能的余数0-9int[] order = new int[10]; //数组orderp[i]用来表示该位是i的数的个数while(m <= d){for(int i = 0; i < a.length; i++){int lsd = ((a[i] / n) % 10);temp[lsd][order[lsd]] = a[i];order[lsd]++;}for(int i = 0; i < 10; i++){if(order[i] != 0)for(int j = 0; j < order[i]; j++){a[k] = temp[i][j];k++;}order[i] = 0;}n *= 10;k = 0;m++;}}/****************不稳定的*****************//*** 选择排序* 方法名:selectSort<BR>* 时间复杂度: O(n^2)* 创建人:潭州学院-liuchao <BR>* 时间:2015年8月22日-下午10:03:19 <BR>* @param a* @return void<BR>* @exception <BR>* @since  1.0.0*/public static void selectSort(int[] a){for (int i = 0; i < a.length-1; i++) {int min=i;//将当前下标定义为最小值下标for (int j = i+1; j < a.length; j++) {if(a[j] < a[min])//如果有小于当前最小值的数据min = j;//将此下标赋给min}if(min != i)swap(a,i,min);//若找到最小值则交换数据}}/*** 希尔排序 * 方法名:shellSort<BR>* 时间复杂度: O(n^2)* 创建人:潭州学院-liuchao <BR>* 时间:2015年8月22日-下午10:03:19 <BR>* @param a* @return void<BR>* @exception <BR>* @since  1.0.0*/public static void shellSort(int[] a){int i,j;int gap=a.length;do{gap=gap/3 + 1;//增量for (i = gap; i < a.length; i++) {//分组进行直接插入排序if(a[i] < a[i-gap]){int temp=a[i];for (j = i-gap;  j>=0 && a[j] > temp; j-=gap) {a[j+gap]=a[j];}a[j+gap]=temp;}}}while(gap > 1);//直到增量为1结束}/*** 堆排序* 方法名:heapSort<BR>* 时间复杂度: O(nlogn)* 创建人:潭州学院-liuchao <BR>* 时间:2015年8月22日-下午10:03:19 <BR>* @param a* @return void<BR>* @exception <BR>* @since  1.0.0*/public static void heapSort(int[] a){  int n=a.length;for(int i=n/2-1;i >= 0;i--){//将数组a构建成大顶堆sift_down(a,i,n-1);}   for(int i=n-1 ;i > 0;i--){swap(a,0,i);//将堆顶数据与当前未排序子序列的最后一个数据交换sift_down(a,0,i-1);//将a[0..i-1]调整为大顶堆}}public static void sift_down(int a[],int x,int y){  int temp=a[x];for(int j=2*x+1;j<=y ;j=2*j+1){//从上向下,从左到右,将每个非叶结点及其子树调整为大顶堆if(j < y && a[j] < a[j+1])j++;           //用j标记左右子树中的较大值if(temp >= a[j])     //若根节点大于左右子树,则跳出break;a[x]=a[j];        //若根节点小于左右子树,则跟较大值交换x=j;}a[x]=temp;    // 交换数据}/*** 快速排序(优化枢轴值)* 方法名:quickSort<BR>* 时间复杂度: O(n^2)* 创建人:潭州学院-liuchao <BR>* 时间:2015年8月22日-下午10:03:19 <BR>* @param a:待排序数组* @return void<BR>* @exception <BR>* @since  1.0.0*/public static void quickSort(int[] a){quick_Sort(a,0,a.length-1);}public static void quick_Sort(int[] a, int low, int high){if(low < high){int point = partition(a,low,high);// 找到枢轴记录的下标quick_Sort(a,low,point-1);// 对低子表进行递归排序quick_Sort(a,point+1,high);// 对高子表进行递归排序}}public static int partition(int[] a,int low,int high){if (low < high){int mid = (low + high)/2;if(a[low] > a[high]) swap(a,low,high);//交换左端与右端的记录,保证左端较小if(a[mid] > a[high])  swap(a,mid,high);//交换中间与右端的记录,保证中间较小if(a[mid] > a[low])       swap(a,mid,low);//交换左端与中间的记录,保证左端较小 }int temp=a[low];// 将三取一后的中间值作为枢轴记录while(low < high){while(low<high && a[high]>=temp) high--;swap(a,low,high);// 把比枢轴记录小的值交换到低端 while(low<high && a[low]<=temp)    low++;swap(a,low,high);// 把比枢轴记录大的值交换到高端 }return low;// 返回枢轴记录的下标}}

主要的排序算法——Java实现相关推荐

  1. 排序算法python实现_合并排序算法– Java,C和Python实现

    排序算法python实现 Merge sort is one of the most efficient sorting algorithms. It works on the principle o ...

  2. 排序算法java版,速度排行:冒泡排序、简单选择排序、直接插入排序、折半插入排序、希尔排序、堆排序、归并排序、快速排序...

    先推荐一篇关于排序算法的文章:http://www.cppblog.com/guogangj/archive/2009/11/13/100876.html 本文思路部分来源于上篇文章,但测得的结果似乎 ...

  3. 九大排序算法Java实现

    之前学习数据结构与算法时花了三天时间整理九大排序算法,并采用Java语言来实现,今天第一次写博客,刚好可以把这些东西从总结的文档中拿出来与大家分享一下,同时作为自己以后的备忘录. 1.排序算法时间复杂 ...

  4. java基础排序_Java排序算法-Java入门|Java基础课程

    1. 课程目标排序是任何语言都会使用到的功能之一,然成果排序的算法有很多,对空间的要求及其时间效率也不尽相同. 本文章以Java语言示例,通过对空间要求.时间效率要求,来对比各种排序算法的使用场景 2 ...

  5. java 快速排序算法简单_排序算法java版,速度排行:冒泡排序、简单选择排序、直接插入排序、折半插入排序、希尔排序、堆排序、归并排序、快速排序......

    先推荐一篇关于排序算法的文章:http://www.cppblog.com/guogangj/archive/2009/11/13/100876.html 本文思路部分来源于上篇文章,但测得的结果似乎 ...

  6. 八大排序算法Java

    概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 我们这里说说八大排序就是内部排序. 当n较大, ...

  7. 常用排序算法-----------JAVA实现

    #常用排序算法-插入排序,选择排序,交换排序,归并排序,基数排序 ###排序算法可归类为以下几类: 插入排序: 直接插入排序(DirectInsertSort): 二分法排序(BinarySort): ...

  8. 排序算法 -- Java

    排序算法 冒泡排序 选择排序 反转排序 冒泡排序 算法思想:从前往后逐步对比每个相邻元素值,满足条件则交换. 实现细节:双层循环,外层循环是排序轮数-(数组长度-1),内层循环负责对比和交换次数-(数 ...

  9. 排序算法 Java实现

    选择排序 核心思想 选择最小元素,与第一个元素交换位置:剩下的元素中选择最小元素,与当前剩余元素的最前边的元素交换位置. 分析 选择排序的比较次数与序列的初始排序无关,比较次数都是N(N-1)/2. ...

  10. 排序算法java源代码_排序算法汇总(java实现,附源代码)

    整理系统的时候发现了原来写的各种算法的总结,看了一下,大吃一惊,那时候的我还如此用心,具体的算法,有的已经模糊甚至忘记了,看的时候就把内容整理出来,顺便在熟悉一下,以后需要的时候就可以直接过来摘抄了. ...

最新文章

  1. 谷歌新深度学习系统可以促进放射科医生的发展
  2. 一个小灯泡引发大论战:千万粉丝科普up主翻车,伊朗“唐马儒”、李永乐等下场,30万公里导线引百万网友围观...
  3. CssVariables_01
  4. 小括号教学设计导入_【教资面试】语文政治历史地理教学设计答题技巧!
  5. C#趣味程序----分数之和
  6. docker linux k8s kubeadm
  7. 关于set的自定义比较函数的使用及结构体的上下二分用法
  8. php钩子配置,thinkphp 行为扩展 钩子与插件的实现
  9. mysql的engine不同,导致事物回滚失败的问题
  10. 多传感器信息融合,介绍中图片为INS+ DVL组合程序
  11. Java 导出CSV文件及实现web下载CSV
  12. [文献阅读]—一篇不错的低资源机器翻译综述(Neural Machine Translation for Low-Resource Languages: A Survey)
  13. python如何输入乘法运算定律_人教版小学四年级数学下册第三单元乘法运算定律(附答案)...
  14. Linux命令之查看磁盘空间
  15. 快手视频艾特实操教学分享,什么是艾特脚本,评论区艾特引流脚本讲解!
  16. Suzy找到实习了吗 Day 21 | 二叉树进行中:530. 二叉搜索树的最小绝对差,501. 二叉搜索树中的众数,236. 二叉树的最近公共祖先
  17. android 自定义popupwindow,自定义通过PopupWindow实现通用菜单
  18. 如何用c语言编写炫酷烟花程序,C语言实现放烟花的程序
  19. 问题:启动tomcat报找不到JAVA_HOME或者JRE_HOME环境变量的问题
  20. 小米手机录音删除了怎么恢复?可自动备份的录音便签

热门文章

  1. 使用LL算法构建AST —— 编程训练
  2. 达梦数据库的静默安装
  3. SAP数据类型 C字符型 character
  4. 支付问题是移动商务基础
  5. 电力运维云平台开启电力系统无人值班、少人值守新模式
  6. 数据库考试之-数据结构
  7. 【小程序】企业微信小程序跳转普通微信无法获取手机号
  8. 关于amd.dll后门病毒入侵3306端口的临时解决方案
  9. C. Need for Pink Slips-Codeforces Round #730 (Div. 2)
  10. 神经网络优化-滑动平均