• 排序算法小结


    一、选择排序

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

      示例代码如下:

    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;
            }*/
    }
  • 相关阅读:
    uni-app快速上手
    uni-app快速上手
    什么是uni-app?
    什么是uni-app?
    美颜小程序准备
    美颜小程序准备
    vue的基本使用
    vue的基本使用
    Web前端开发(高级)下册-目录
    Web前端开发(高级)下册-目录
  • 原文地址:https://www.cnblogs.com/hoobey/p/6501202.html
Copyright © 2020-2023  润新知