zoukankan      html  css  js  c++  java
  • 常见排序java实现

    public class Sort
    {
    
        public static void main(String[] args) 
        {
            int[] data = {49,38,65,97,76,13,27,49};
            int[] res = data;
            final int N = data.length;
            bubbleSort(data,N);
            printData(data,N);
    
            directInsertSort(data,N);
            printData(data,N);
    
            binaryInsertSort(data,N);
            printData(data,N);
    
            shellSort(  data,N);
            printData(data,N);
    
            quickSortWithRecursion(data,N);
            printData(data,N);
    
            mergeSort(data,N);
            printData(data,N);
    
            heapSort(data,N);
            printData(data,N);
        }
    
        public static void printData(int[] data, int n) 
        {
            for (int e :data ) {
                System.out.print(e+"	");
            }
            System.out.println();
            System.out.println();
        }
        public static void bubbleSort(int[] data, int n)
        {
            System.out.print("改进冒泡排序:	");
            int flag = n-1;
            int k = n-1;
            int temp;
    
            while(flag>0)
            {
                k = flag;
                flag = 0;
                for(int j=0;j<k;j++)
                {
                    if(data[j]>data[j+1])
                    {
                        temp = data[j];
                        data[j] = data[j+1];
                        data[j+1] = temp;
                        flag = j+1;
                    }
                }
            }
    
        }
    
        public static void directInsertSort(int[] data, int n)
        {
            System.out.print("直接插入排序:	");
            int temp;
            int i;
            int j;
            for(i=1;i<n;i++)
            {
                temp = data[i];
    
                for(j=i-1;j>=0 && data[j]>temp;--j)
                {
                    data[j+1]  =data[j];
                }
                data[j+1] = temp;
            }
        }
    
    
        public static void binaryInsertSort(int[] data, int n)  
        {
            System.out.print("折半插入排序:	");
            int i,j,temp;
            int location;
            int l,h,m;
            for(i=1;i<n;i++)
            {
                temp = data[i];
    
                l = 0;
                h = i-1;
                while(l<=h)
                {
                    m = (l+h)/2;
                    if(temp==m) location = m+1;
                    else if (temp<m) {
                        h = m-1;    
                    }
                    else l = m+1;
                }
                location = l;
    
                for(j=i-1;j>=location;--j)
                {
                    data[j+1] = data[j];
                }
                data[location] = temp;
            }
        }
    
        public static void shellSort(int[] data, int n) 
        {
            System.out.print("希尔排序:		");
            int i,j,temp;
            for(int gap=n/2;gap>0;gap/=2)
            for(i=gap;i<n;i+=gap)
            {
                temp = data[i];
                for(j=i-gap;j>=0&&data[j]>temp;j-=gap)
                {
                    data[j+gap] = data[j];
                }
                data[j+gap] = temp;
            }
        }
    
        public static void quickSortWithRecursion(int[] data, int n)
        {
            System.out.print("递归快速排序:	");
            quickSortWithRecursion1(data,0,n-1);
        }
    
        public  static void quickSortWithRecursion1(int[] data, int low, int high)
        {
            if(low>=high) return;  //这句很重要,否则会栈溢出
            int location = locate(data,low,high);
            quickSortWithRecursion1(data,low,location-1);
            quickSortWithRecursion1(data,location+1,high);
        }
    
        public static int locate(int[] data, int low, int high)
        {
            int temp = data[low];
            while(low<high)
            {
                while(low<high && data[high]>temp) --high;
                if(low<high) data[low] = data[high];
    
                while(low<high && data[low]<=temp) ++low;
                if(low<high) data[high]=data[low];
            }
            data[low] = temp;
            return low;
        }
    
    
        public static void mergeSort(int[] data, int n)
        {
            System.out.print("归并排序:		");
            mergeSortImpl(data,0,n-1);
        }
        public static void mergeSortImpl(int[] data, int low, int high)
        {
            if(low>=high) return;
            int mid = (low+high)/2;
            int k = -1;
            int index;
            mergeSortImpl(data,low,mid);
            mergeSortImpl(data,mid+1,high);
            if(data[mid]<=data[mid+1]) return;  //等号关键
    
            int[] temp = new int[high-low+1];
            int i=low,j=mid+1;
            while(i<=low && j<=high)
            {
                temp[++k] = max(data[i],data[j]);
            }
            while(i<=low) temp[++k] = data[i];
            while(j<=high) temp[++k] = data[j];
            for(index=0;index<=k;++index)
            {
                data[low+index] = temp[index];
            }
        }
        public static int max(int a, int b)
        {
            return a>b?a:b;
        }
    
        public static void heapSort(int[] data, int n)
        {
            System.out.print("堆排序:			");
            int[] arr = new int[n+1];
            System.arraycopy(data,0,arr,1,n);
            heapSortImpl(arr,1,n);
            System.arraycopy( arr,1,data,0,n);
        }
    
        public static void heapSortImpl(int[] data, int low, int high)
        {
            int temp;
            for(int i=high/2;i>=1;--i)
            {
                adjust(data,i,high);
            }
            for(int i=high;i>=2;--i)
            {
                temp = data[1];
                data[1] = data[i];
                data[i] = temp;
                adjust(data,1,i-1);
            }
        }
    
        public static void adjust(int[] data, int low, int high)
        {
            int i=low;
            int j=low*2;
        /*  int temp=data[i];
            while(j<=high)
            {
                if(j<high && data[j]<data[j+1]) ++j;
                if(temp<data[j]) 
                {
                    data[i] = data[j];
                    i = j;
                    j = 2*i;
                }
                else 
                    break;
            }
            data[i] = temp;*/
            int temp;
    
            while(j<=high)
            {
                if(j<high && data[j]<data[j+1]) ++j;  //j<high不能取等号
    
                if(data[i]<data[j])
                {
                    temp = data[i];
                    data[i] = data[j];
                    data[j] = temp;
                    i = j;
                    j = i*2;
                }
                else break;
            }
    
        }
    }
    
    
  • 相关阅读:
    网络基础 港湾FlexHammer5010交换机镜像端口配置
    HttpWatch HttpWatch时间表(HttpWatch Time Charts)
    网络基础 计算机网络速率,带宽,吞吐量概念
    Kubernetes 1.11.2概述和搭建(多节点)
    Ubuntu 搭建docker registry 私有仓库
    Ubuntu 搭建etcd
    python 多线程删除MySQL表
    python 统计MySQL表信息
    基于Prometheus的Pushgateway实战
    基于docker 搭建Elasticsearch6.2.4(centos)
  • 原文地址:https://www.cnblogs.com/yldf/p/6249875.html
Copyright © 2011-2022 走看看