zoukankan      html  css  js  c++  java
  • 排序算法小结

    一、选择排序

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

      示例代码如下:

    public class StraightSelectSort
    {
        /**
         * 选择排序
         * @param a
         */
        public static void sort(int[] a)
        {
            int n=a.length;
            for(int i=0;i<n;i++)
            {
                int min=i;
                /**
                 * 找到i后面最小的值
                 */
                for(int j=i+1;j<n;j++)
                {
                    if(a[j]<a[min])
                        min=j;
                }
                /*
                 * 将i位置上的值与后面的最小值对换
                 */
                changeData(a, i, min);
            }
        }
        //交换数据
        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 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<n;i++)
            {
                for(int j=i;j>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<d;i++)
                    for(int j=i;j+d<a.length;j=j+d)
                    {
                        if(a[j]>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]<v)
                {
                    if(i==hi)
                        break;
                }
                while(v<a[--j])
                {
                    if(j==lo)
                        break;
                }
                if(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;
            }*/
    }
  • 相关阅读:
    CF1202F You Are Given Some Letters...
    CF1178E Archaeology
    PTA (Advanced Level) 1005 Spell It Right
    PTA (Advanced Level) 1004 Counting Leaves
    Qt5——从零开始的Hello World教程(Qt Creator)
    PTA (Advanced Level) 1003 Emergency
    PTA (Advanced Level) 1002 A+B for Polynomials
    HDU 1272 小希的迷宫
    FZU 2150 Fire Game
    HihoCoder
  • 原文地址:https://www.cnblogs.com/xujian2014/p/5217129.html
Copyright © 2011-2022 走看看