常用排序算法 java

比较常见的几种排序:

1.冒泡排序,时间复杂度O(n^2)

2.插入排序,时间复杂度O(n^2)

3.希尔排序,由于是跳跃式的,采用Sedgewick增量序列,猜想时间复杂度O(n^4/3)

4.归并排序,时间复杂度O(nlogn)

//冒泡排序
public class test1
{
    public static void main(String[] args) 
    {
        int[] arr=new int[]{6,5,4,3,2,1,0,-1};
        arr=bubbleSort(arr,arr.length);
        for(int i=0;i<arr.length;i++)
        {
            System.out.print(arr[i]);
        }
    }
    public static int[] bubbleSort(int[] arr,int n)
    {
        for(int j=0;j<n;j++)
        {
            for (int i=0;i<n-j-1 ;i++ )
            {
                if (arr[i]>arr[i+1])
                {
                    int temp=arr[i];
                    arr[i]=arr[i+1];
                    arr[i+1]=temp;
                }
            
            }
        }
        return arr;
    }
}
//插入排序
public class InsertSort {
    public static void main(String[] args)
    {
        int[] arr=new int[]{6,5,4,3,2,1,0,-1};
        arr=insertSort(arr,arr.length);
        for(int i=0;i<arr.length;i++)
        {
            System.out.print(arr[i]);
        }
    }
    public static int[] insertSort(int[] arr,int n)
    {
        for(int i=1;i<n;i++)
        {
            int current=arr[i];
            for(int j=i;j>0&&current<arr[j-1];j--)
            {
                arr[j]=arr[j-1];
                arr[j-1]=current;
            }
        }
        return arr;
    }
}
//希尔排序
public class ShellSort {
    public static void main(String[] args)
    {
        int[] arr=new int[]{1,2,3,4,5,6,7,9,8};
        arr=shellSort(arr,arr.length);
        for(int i=0;i<arr.length;i++)
        {
            System.out.print(arr[i]);
        }
    }
    public static int[] shellSort(int[] arr,int n)
    {
        int si=0;
        int d=0;
        //采用Sedgewick增量序列
        int Sedgewick[] = {929, 505, 209, 109, 41, 19, 5, 1, 0};
        //找出补超过数组长度的增量序列最大值
        for(si=0;Sedgewick[si]>n;si++)
        {}
        //增量序列由不超过数组长度的最大值减小到1
        for(d=Sedgewick[si];d>0;d=Sedgewick[++si])
        {
            for(int i=d;i<n;i=i+d)
            {
                int current=arr[i];
                for(int j=i;j>0&&current<arr[j-d];j=j-d)
                {
                    arr[j]=arr[j-d];
                    arr[j-d]=current;
                }
            }
        }
        return arr;
    }
}
//归并排序
public class MergeSort {
    public static void main(String[] args)
    {
        int[] arr=new int[] {9,8,7,6,5,4,3,2,1};
        int n=arr.length;
        arr=mergeSort(arr,n);
        for(int i=0;i<arr.length;i++)
            System.out.print(arr[i]+" ");
    }
    //将两个有序数组合并函数
    public static void merge(int[] arr,int l,int r,int rightEnd)
    {
        int numElements=rightEnd-l+1;
        int[] temp=new int[arr.length];
        int leftEnd=r-1;
        int i=l;
        while(l<=leftEnd&&r<=rightEnd)
        {
            if(arr[l]<=arr[r])
                temp[i++]=arr[l++];
            else
                temp[i++]=arr[r++];
        }
        while(l<=leftEnd)
            temp[i++]=arr[l++];
        while(r<=rightEnd)
            temp[i++]=arr[r++];
        
        for (int j=0;j<numElements;j++,rightEnd--)
            arr[rightEnd]=temp[rightEnd];
    
    }
    //用递归的归并排序
    public static void merge_Sort(int[] arr,int l,int rightEnd)
    {
        int center=(l+rightEnd)/2;
        if(l<rightEnd)
        {
            merge_Sort(arr,l,center);
            merge_Sort(arr,center+1,rightEnd);
            merge(arr,l,center+1,rightEnd);
        }
    }
    //用和其他排序方法统一的接口形式
    public static int[] mergeSort(int[] arr,int n)
    {
        merge_Sort(arr,0,n-1);
        return arr;
    }

}

 

 

 

======================================================================================================================================================

快速排序:

      快速排序是选定一个基准数(怎么选自己决定,可以选数组第一个元素,数组最后一个元素,或者数组第一个和最后一个及中间数三者的中位数),经过左右两边与基准数比较,最后基准数左边都是小于等于它的,右边都是大于或等于它的。也就是说,基准数找到位置后就不会改变它在数组中的位置。不像快速排序,如果新加入的数比已经排好的数小,贼原先排好的数都要往后挪一位,这是很费时间的。

       快速排序的平均时间复杂度为O(nlogn),最坏情况下时间复杂度为O(n^2)

public class test1 {

    public static void main(String[] args)
    {
        QuickSort qs=new QuickSort();
        int[] arr=new int[] {9,8,7,6,5,4,9,3,2,1};
        arr=qs.quick_Sort(arr,arr.length-1);
        for(int i=0;i<arr.length;i++)
            System.out.print(arr[i]+" ");    
    }
}
class QuickSort {
    public void quickSort(int[] arr,int left,int right){
        //如果低位数等于或大于高位数,不作处理
        if(left>=right)
            return;
        int pivot=media3(arr,left,right);
        int low=left;
        int high=right;
        //当低位数比高位数小时跳出循环
        while(low<high)
        {    
            while(pivot<=arr[high]&&low<high)
                high--;
            while(pivot>=arr[low]&&low<high)
                low++;
            if(low<high)
            {
                int temp=arr[low];
                arr[low]=arr[high];
                arr[high]=temp;
            }
        }
        //将基准数放到正确的位置上
        arr[left]=arr[low];
        arr[low]=pivot;
        //递归调用快速排序
        quickSort(arr,left,low-1);
        quickSort(arr,low+1,right);
        
        
    }
    //找出数组中左,中,右三个数的中位数,并把它放在数组左位上
    public int media3(int[] arr,int left,int right)
    {
        int center=(left+right)/2;
        if(arr[left]>arr[center])
            swap(arr,left,center);
        if(arr[left]>arr[right])
            swap(arr,left,right);
        if(arr[center]>arr[right])
            swap(arr,center,right);
        swap(arr,left,center);
        return arr[left];
    }
    //交换数组中两个数的位置
    public void swap(int[] arr,int a,int b)
    {
        int temp=arr[a];
        arr[a]=arr[b];
        arr[b]=temp;
    }
    public int[] quick_Sort(int arr[],int n)
    {
        quickSort(arr,0,arr.length-1);
        return arr;
        
    }

}

 

posted on 2018-06-06 14:00  yfyfyf947  阅读(130)  评论(0编辑  收藏  举报