zoukankan      html  css  js  c++  java
  • 排序(2)--希尔,快速,归并

    1.希尔

    (1)原理:按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组

    (2)时间复杂度: O(nlogn)

    (3)算法稳定性:不稳定

    (4)代码实现:

    public void sort(int[] array)
        {
            int size=array.length;
            int k=0;
            for(int i=size/2;i>=1;i=i/2)
            {
                for(int j=i;j<size;j++)
                {
                    int temp=array[j];
                    for(k=j-i;k>=0&&temp<array[k];k-=i)
                    {
                        array[k+i]=array[k];
                    }
                    array[k+i]=temp;
                }
            }
        }

    2.快速

    (1)原理:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序

    (2)时间复杂度: O(nlogn)

    (3)算法稳定性:不稳定

    (4)代码实现:

    public void sort(int[] array)
        {
            int right=array.length-1;
            int left=0;
            _sort(array,left,right);
        }
    
        private void _sort(int[] array, int left, int right) {
            if(left<right)
            {
                int _cut=cut(array,left,right);
                _sort(array,left,_cut-1);
                _sort(array,_cut+1,right);
            }
            
        }
    
        private int cut(int[] array, int left, int right) {
            int temp=array[left];
            while(left<right)
            {
                while(left<right&&temp<=array[right])
                {
                    right--;
                }
                if(left<right)
                {
                    array[left]=array[right];
                    left++;
                }
                while(left<right&&temp>=array[left])
                {
                    left++;
                }
                if(left<right)
                {
                    array[right]=array[left];
                    right--;
                }
            }
            array[left]=temp;
            return left;
        }

    3.归并

    (1)原理:通过不断分割到不能分割,再把所有子序列按序合并

    (2)时间复杂度: O(nlogn)

    (3)算法稳定性:稳定

    (4)代码实现:

    public void sort(int[] array)
        {
            mergesort(array,0,array.length-1);
        }
    
        private void mergesort(int[] array, int i, int j) {
            int mid=(i+j)/2;
            if(i<j)
            {
                mergesort(array,i,mid);
                mergesort(array,mid+1,j);
                merge(array,i,mid,j);
            }
        }
    
        private void merge(int[] array, int i, int mid, int j) {
            int[] temp=new int[j-i+1];
            int left=i;
            int right=mid+1;
            int num=0;
            while(left<=mid&&right<=j)
            {
                if(array[left]<array[right])
                {
                    temp[num]=array[left];
                    num++;left++;
                }
                else
                {
                    temp[num]=array[right];
                    num++;right++;
                }
            }
            while(left<=mid)
            {
                temp[num]=array[left];
                num++;left++;
            }
            while(right<=j)
            {
                temp[num]=array[right];
                num++;right++;
            }
            for(int flag=0;flag<j-i+1;flag++)
            {
                array[i+flag]=temp[flag];
            }
        }
  • 相关阅读:
    Java中关于时间日期格式保存到mysql的问题
    传输json数据到前台的时候,数据中包含日期数据
    字符串的分隔方法 split()
    实体类中用基本类型好,还是用包装类型
    Android中的task和stack
    在res文件下新建文件夹
    Android活动和碎片的生命周期及addToBackStack()方法
    draw9patch图片拉伸
    Android studio新建文件出现setContentView(R.layout.activity_main);中的R标红错误解决方法
    listview控件的使用
  • 原文地址:https://www.cnblogs.com/blogofjzq/p/9229238.html
Copyright © 2011-2022 走看看