zoukankan      html  css  js  c++  java
  • 排序算法合集(Java)

    整理了一下常用的排序算法,算法过程和示意图不详细讲,百度很多,只列代码,如有错误,还望大家指出。
    1.冒泡排序

    public static void bubbleSort(int[] a){
        for(int i=a.length-1;i>0;i--){
            for(int j=0;j<i;j++){
                if(a[j]>a[j+1]){
                    int tmp=a[j];
                    a[j]=a[j+1];
                    a[j+1]=tmp;
                }
            }   
        }
    }

    ,冒泡排序的时间复杂度为O(n^2),是稳定的算法
    2.快速排序

    public static void quickSort(int[] a,int l,int r){
        if(l<r){
            int i,j,x;
            i=l;
            j=r;
            x=a[i];
            while(i<j){
                while(i<j&&a[j]>x)
                    j--;
                if(i<j)
                    a[i++]=a[j];
                while(i<j&&a[i]<x)
                    i++;
                if(i<j)
                    a[j--]=a[i];
            }
            a[i]=x;
            quickSort(a,l,i-1);
            quickSort(a,i+1,r);
        }
    }

    快速排序的时间复杂度O(N*logN),不稳定算法
    3.插入排序

    public static void insertSort(int[] a){
        int i,j,k;
        for(i=1;i<a,length;i++){
            for(j=i-1;j>=0;j--){
                if(a[j]<a[i])
                    break;
            }
            if(j!=i-1){
                int tmp=a[i];
                for(k=i-1;k>j;k--)
                    a[k+1]=a[k];
                a[k+1]=tmp;
            }
        }
    }

    插入排序的时间复杂度O(N^2),稳定的算法
    4.希尔排序

    public static void shellSort(int[] a){
        for(int gap=a.length/2;gap>0;gap/=2){
            for(int i=0;i<gap;i++){
                for(int j=i+gap;j<a.length;j+=gap){
                    if(a[j]<a[j-gap]){
                        int tmp=a[j];
                        int k=j-gap;
                        while(k>=0&&a[k]>tmp){
                            a[k+gap]=a[k];
                            k-=gap;
                        }
                        a[k+gap]=tmp;
                    }
                }
            }
        }
    }

    希尔排序的时间复杂度与gap有关,当增量为1时,蜕化成插入排序,此时的复杂度为O(N^2),而Hibbard增量的希尔排序的时间复杂度为O(N^3/2),不稳定算法
    5.选择排序

    public static void selectSort(int[] a){
        int i,j,min;
        for(i=0;i<a.length;i++){
            min=i;
            for(j=i+1;j<a.length;j++){
                if(a[j]<a[min])
                    min=j;  
            }
            if(min!=i){
                int tmp=a[i];
                a[i]=a[min];
                a[min]=tmp;
            }
        }
    }

    选择排序的时间复杂度为O(N^2),稳定的算法
    6.堆排序

    //最大堆的向下调整算法
    publi static void maxHeapDown(int[] a,int start,int end){
        int c=start;
        int l=2*c+1;
        int tmp=a[c];
        for(;l<=end;c=l,l=2*l+1){
            if(l<end&&a[l]<a[l+1])
                l++;
            if(tmp>a[l])
                break;
                else{
                    a[c]=a[l];
                    a[l]=tmp;
                }
        }
    }
    //堆排从小到大
    public static void heapSortAsc(int[] a,int n){
        int i,tmp;
        for(i=n/2-1;i>=0;i--)
            maxHeapDown(a,i,n-1);
        for(i=n-1;i>0;i--){
            tmp=a[0];
            a[0]=a[i];
            a[i]=tmp;
            maxHeapDown(a,0,i-1);
        }
    }
    
    
    //最小堆的向下调整算法
    public static void minHeapDown(int[] a,int start,int end){
        int c=start;
        int l=2*c+1;
        int tmp=a[c];
        for(;i<=end;c=1,l=2*l+1){
            if(l<end&&a[l]<a[l+1])
                l++;
            if(tmp<=a[l])
                break;
            else{
                a[c]=a[l];
                a[l]=tmp;
            }
        }
    }
    
    //堆排序从大到小
    
    public static void heapSortDesc(int[] a,int n){
        int i,tmp;
        for(i=n/2-1;i>=0;i--)
            minHeapDown(a,0,n-1);
        for(i=n-1;i>0;i--){
            tmp=a[0];
            a[0]=a[i];
            a[i]=tmp;
            minHeapDown(a,0,i-1);
        }
    }

    堆排序的时间复杂度O(N*logN),不稳定算法
    7.归并排序

    public static void merge(int[] a,int start,int mid,int end){
        int[] tm=new int[end-start+1];
        int i=start;
        int j=mid+1;
        int k=0;
        while(i<=mid&&j<=end){
            if(a[i]<a[j])
                tmp[k++]=a[i++];
            elss
                tmp[k++]=a[j++];
        }
        while(i<=mid)
            tmp[k++]=a[i++];
        while(j<=end)
            tmp[k++]=a[j++];
        for(i=0;i<k;i++)
            a[start+i]=tmp[i]'
        tmp=null;
    }
    //归并排序(由上往下)
    
    public static void mergeSortUp2Down(int[] a,int start,int end){
        if(a==null||start>=end)
            return;
        int mid=start+(end-start)/2;
        mergeSortUp2Down(a,start,mid);
        mergeSortUp2Down(a,min+1,end);
        merge(a,start,mid,end);
    }
    
    
    //归并排序(从下往上)
    public atatic void mergeDown2Up(int[] a){
        if(a==null)
            return;
        for(int n=1;n<a.length;n*=2)
            mergeGroup(a,a.length,n);
    }
    
    public static void mergeGroups(int[] a,int len,int gap){
        int i;
        int twolen=2*gap;
        for(i=0;i+2*gap-1<len;i+=(2*gap))
            merge(a,i,i+gap-1,i+2*gap-1);
        if(i+gap-1<len-1)
            merge(a,i,i+gap-1,len-1);
    }

    归并排序的时间复杂度为O(N*logN),稳定的算法
    8.桶排序

    public static void bucketSort(int[] a,int max){
        int[] buckets;
        if(a==null||max<1)
            return;
        buckets=new int[max];
        for(int i=0;i<a.length;i++){
            buckets[a[i]]++;
        }
        for(int i=0,j=0;i<max;i++){
            while((buckets[i]--)>0){
                a[j++]=i;
            }
        }
        buckets=null;
    }

    转自:http://wangkuiwu.github.io
    感谢wangkuiwu大神

  • 相关阅读:
    H5新特性---Web Worker---Web Stroage
    H5新特性---SVG--椭圆--直线--文本--滤镜(高斯滤镜--模糊)--地理定位
    H5新特性——--第三方绘图工具库 echarts(canvas)---SVG绘图
    H5新特性-canvas绘图--渐变对象路径(最复杂)--图片--变形操作
    H5新特性-视频,音频-Flash-canvas绘图
    JQUERY-自定义插件-ajax-跨域访问
    JQUERY-插件
    JQUERY-事件-动画-类数组对象-添加自定义API
    JQUERY-修改-API-事件绑定
    jsp第五章
  • 原文地址:https://www.cnblogs.com/Mayny/p/9374188.html
Copyright © 2011-2022 走看看