排序算法

来源:互联网 发布:华大基因 云计算 编辑:程序博客网 时间:2024/05/16 12:35
package itcast01;import java.util.Scanner;public class Sort {    public static void main(String[] args) {        // TODO Auto-generated method stub      Scanner sc=new Scanner (System.in);      int len=sc.nextInt();      int[]num=new int[len];      for(int i=0;i<len;i++){          num[i]=sc.nextInt();      }      Sort s=new Sort();      // s.inserSort(num);      // s.shellSort(num);      // s.quickSort(num,0,len-1);      // s.selectSort(num);      // s.bubbleSort(num);      // s.mergeSort(num, 0, len);       s.heapSort(num);       for(int i=0;i<len;i++){          System.out.println(num[i]);      }    }//////插入排序,时间复杂度n^2,空间复杂度为O(1),稳定///    private void  inserSort(int[] num){        int len=num.length;        if(len==0)            return;        int j;        for(int i=1;i<len;i++){             int tmp=num[i];  //移位的时候将num[i]覆盖了            for(j=i;j>0&&tmp<num[j-1];j--)                 num[j]=num[j-1];            num[j]=tmp;        }    }//希尔排序,时间复杂度n^2(与gap的选择有关),空间复杂度为O(1),稳定//////////////////////////////////////////    private void shellSort(int[] num){        int len=num.length;        int j;        for(int gap=len/2;gap>0;gap/=2)            for(int i=gap;i<len;i++){                int tmp=num[i];                for(j=i;j>=gap&&tmp<num[j-gap];j-=gap)                    num[j]=num[j-gap];                num[j]=tmp;        }    }//快速排序,采用递归的方法,时间复杂度为O(nlogn),空间复杂度为O(logn)递归造成了栈空间的使用,不稳定,T(n)<=2T(n/2)+n<=2(2T(n/4)+n/2)+n=4T(n/4)+2n=8T(n/8)+3n.......nT(1)+n*logn=O(nlogn)    private void quickSort(int[] num,int left,int right) {        // TODO Auto-generated method stub        if(left>=right)            return;        int tmp=num[left];        int i=left;        int j=right;        while(i<j){            while(num[j]>=tmp&&i<j)                 j--;            swap(num,i,j);            while(num[i]<=tmp&&i<j)                i++;            swap(num,i,j);          }        quickSort(num,left,i-1);        quickSort(num,i+1,right);    }//选择排序时间复杂度为O(n^2)空间复杂度为O(1)稳定最坏和最好都是O(n^2)    private void selectSort(int[] num) {        // TODO Auto-generated method stub         int len=num.length;        for(int i=0;i<len-1;i++){            int tmp=i;            for(int j=i+1;j<len;j++){//找到i后面的最小的一个位置                if(num[j]<num[tmp])                    tmp=j;              }            swap(num,i,tmp);        }    }    //冒泡排序时间复杂度为O(n^2)空间复杂度为O(1)稳定    private void bubbleSort(int[] num) {        // TODO Auto-generated method stub        int len=num.length;        for(int i=1;i<len;i++){       //i表示第i趟,同时也表示前i-1个数字已经排好序了            for(int j=len-1;j>=i;j--){   //注意j是从后往前遍历的                if(num[j]<num[j-1]){      //小的数字往上浮                    swap(num,j,j-1);                }            }        }    }//并归排序时间复杂度为O(nlogn)空间复杂度为O(n),稳定    private void mergeSort(int[] num,int start,int end) {        // TODO Auto-generated method stub        if(start<end-1){            int mid=start+(end-start)/2;            mergeSort(num,start,mid);            mergeSort(num,mid,end);            merge(num,start,mid,mid,end);        }    }    /*包头不包尾*/    private void merge(int[] num, int start1, int end1, int start2, int end2) {        // TODO Auto-generated method stub        int i=start1;        int j=start2;        int[]tmp=new int[end2-start1];        int k=0;        while(i<end1&&j<end2){            if(num[i]<num[j])                tmp[k++]=num[i++];            else                    tmp[k++]=num[j++];        }        while(i<=end1-1)            tmp[k++]=num[i++];        while(j<=end2-1)            tmp[k++]=num[j++];        k=start1;        for(int element:tmp){            num[k++]=element;        }    }//堆排序,建堆的复杂度为n,调整堆的复杂度为logn,堆排序的时间复杂度为nlogn,不稳定,空间复杂度为 O(1)    private void heapSort(int[] num) {        // TODO Auto-generated method stub        int len=num.length;        for(int i=len/2-1;i>=0;i--){            preDown(num,i,len);        }        for(int i=len-1;i>0;i--){            swap(num,0,i);            preDown(num,0,i);        }    }    private void preDown(int[] num, int i, int len) {        // TODO Auto-generated method stub        int child;        int tmp;        for(tmp=num[i];leftChild(i)<len;i=child){            child=leftChild(i);            if(child!=len-1&&num[child]<num[child+1])                child++;            if(tmp<num[child])                num[i]=num[child];            else                break;        }        num[i]=tmp;    }    private int leftChild(int i) {        // TODO Auto-generated method stub        return 2*i+1;    }    private void swap(int[] num, int i, int j) {        // TODO Auto-generated method stub        if(i!=j){            int tmp=num[i];            num[i]=num[j];            num[j]=tmp;        }    }}
原创粉丝点击