博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
排序算法小结
阅读量:4691 次
发布时间:2019-06-09

本文共 3321 字,大约阅读时间需要 11 分钟。

一、选择排序

  原理是每一次从待排序的数据元素中选出最小的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。

  示例代码如下:

public class StraightSelectSort{    /**     * 选择排序     * @param a     */    public static void sort(int[] a)    {        int n=a.length;        for(int i=0;i

二、插入排序

  基本思想是每一步将一个待排序的元素,按照其关键码值的大小插入到已经排序的文件适当位置上,直到全部插入完为止。

  示例代码:

/** * 插入排序 * @author Administrator * */public class InsertSort{    public static void sort(int[] a)    {        int n=a.length;        /**         * 对于0到n-1之间的每一个i,将a[i]与a[0]到a[i-1]中比它小的所有元素都依次有序交换         * 在i由左到右的过程中,它左侧的元素总是有序的         */        for(int i=1;i
0 && (a[j]-a[j-1])<0;j--) { changeData(a, j, j-1); } } } //交换数据 private static void changeData(int[] a, int i, int min) { int temp; temp=a[i]; a[i]=a[min]; a[min]=temp; }}

三、希尔排序

  希尔排序是插入排序的一种,也称为缩小增量排序,是直接插入排序算法的一种更高效的改进版本。基本思想是把记录按下标的一定增量分组,对每组使用直接插入算法排序,随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件就被分为一组,算法终止。

  示例代码:

/** * 希尔排序 * @author Administrator * */public class ShellSort{    public static void sort(int[] a)    {        int d=a.length; //间距初始值设为数组长度        while(true)        {            for(int i=0;i
a[j+d]) { changeData(a, j, j+d); } } if(d==1) break; d--; } } //交换数据 private static void changeData(int[] a, int i, int min) { int temp; temp=a[i]; a[i]=a[min]; a[min]=temp; }}

四、快速排序

  快速排序是对冒泡排序的一种改进,基本思想是:通过一趟排序将要排序的数据分割成独立的两个部分,其中一个部分的所有数据都比另外一个部分的所有数据都要小,然后在按照此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

 
/**  * 快速排序  * @author Administrator  *  */public class QuickSort{    public static void sort (int []a)    {        sort(a,0,a.length-1);    }    private static void sort(int []a,int lo,int hi)    {        if(hi<=lo)            return ;        int j=partition(a,lo,hi);        sort(a,lo,j-1);        sort(a,j+1,hi);    }        static int partition(int s[], int lo, int hi) //返回调整后基准数的位置      {          int i = lo, j = hi;          int x = s[lo]; //s[lo]即s[i]就是第一个坑          while (i < j)          {              // 从右向左找小于x的数来填s[i]              while(i < j && s[j] >= x)                   j--;                if(i < j)               {                  s[i] = s[j]; //将s[j]填到s[i]中,s[j]就形成了一个新的坑                  i++;              }                    // 从左向右找大于或等于x的数来填s[j]              while(i < j && s[i] < x)                  i++;                if(i < j)               {                  s[j] = s[i]; //将s[i]填到s[j]中,s[i]就形成了一个新的坑                  j--;              }          }          //退出时,i等于j。将x填到这个坑中。          s[i] = x;          return i;      }  /*    private static int partition(int[] a, int lo, int hi)    {        int i=lo;        int j=hi+1;        int v=a[lo];        while(true)        {            while(a[++i]
=j) break; changeData(a, i, j); } changeData(a, lo, j); return j; } //交换数据 private static void changeData(int[] a, int i, int j) { int temp; temp=a[i]; a[i]=a[j]; a[j]=temp; }*/}

转载于:https://www.cnblogs.com/hoobey/p/6501202.html

你可能感兴趣的文章
数据库插入数据乱码问题
查看>>
altium annotate 选项设置 complete existing packages
查看>>
【模式识别与机器学习】——SVM举例
查看>>
【转】IT名企面试:微软笔试题(1)
查看>>
IO流入门-第十章-DataInputStream_DataOutputStream
查看>>
DRF的分页
查看>>
Mysql 模糊匹配(字符串str中是否包含子字符串substr)
查看>>
python:open/文件操作
查看>>
流程控制 Day06
查看>>
Linux下安装Tomcat
查看>>
windows live writer 2012 0x80070643
查看>>
tomcat 和MySQL的安装
查看>>
11.5 内部类
查看>>
Cosine Similarity
查看>>
halt和shutdown 的区别
查看>>
git常用操作
查看>>
京东SSO单点登陆实现分析
查看>>
u-boot启动第一阶段
查看>>
MySQL批量SQL插入性能优化
查看>>
定义列属性:null,default,PK,auto_increment
查看>>