• 排序(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];
            }
        }
  • 相关阅读:
    录音 静音检测
    Busybox是什么?
    ubuntu 和VMWare共享数据时故障解决
    使用IStream和GDI+在内存中实现图像格式转换
    .Net 玩自动化测试
    【C#|.NET】跳出一致性Hash算法 打造更高效的分布式缓存
    【C#|.NET】从细节出发(一) 通用接口 aop dto 相关
    【linux+C】神器 vim + 指针相关客串
    【C#|.NET】分布式锁服务
    读书笔记: CLR篇 (让你了解C#.Net的实质) (20111219更新)
  • 原文地址:https://www.cnblogs.com/blogofjzq/p/9229238.html
Copyright © 2020-2023  润新知