zoukankan      html  css  js  c++  java
  • 八大经典排序算法(java)

    算法的时间复杂度

    package com.算法.排序;
    
    public class 冒泡排序 {
       // 时间复杂度 :O(n2);
        public static void main(String[] args){
            int[] array = new int[100000];
            for(int i=0;i<array.length;i++){
                array[i] = (int)(Math.random()*200000);
            }
            long t1 = System.currentTimeMillis();
            array = sort01(array);
            long t2 = System.currentTimeMillis();
            for(int i=0,j=1;i<array.length;j++,i++){
                System.out.print(array[i]+"  ");
                if(j%10==0){
                    System.out.println();
                }
            }
            System.out.println("冒泡排序算法耗费"+(t2-t1)+"毫秒");
        }
        public static int[] sort01(int[] array){ //冒泡排序
            boolean flag = false ; //做标记进行优化
            for(int i=0;i<array.length-1;i++){
                for(int j=0;j<array.length-1-i;j++){
                    if(array[j]>array[j+1]){
                        flag=true;
                        int temp=array[j];
                        array[j]=array[j+1];
                        array[j+1]=temp;
                    }
                }
                if(!flag){
                    break;
                }else{
                    flag=false;
                }
            }
            return array;
        }
    }
    
    
    package com.算法.排序;
    
    public class 选择排序 {
        //时间复杂度:O(n2)
        public static void main(String[] args){
            int[] array = new int[100000];
            for(int i=0;i<array.length;i++){
                array[i]=(int)(Math.random()*200000);
            }
            long t1 =System.currentTimeMillis();
            array = sort02(array);
            long t2 =System.currentTimeMillis();
            for(int i=0,j=1;i<array.length;j++,i++){
                System.out.print(array[i]+"  ");
                if(j%10==0){
                    System.out.println();
                }
            }
            System.out.println("选择排序算法耗费"+(t2-t1)+"毫秒");
        }
        public static int[] sort02(int[] array){ //选择排序
            for(int i=0;i<array.length-1;i++){
                int min = array[i];
                int index = i;
                for(int j=i+1;j<array.length;j++){
                    if(min>array[j]){
                        min=array[j];
                        index=j;
                    }
                }
                if(i!=index){
                    array[index] = array[i];
                    array[i] = min;
                }
            }
            return array;
        }
    }
    
    
    package com.算法.排序;
    
    public class 插入排序 {
        //时间复杂度:O(n2);
        public static void main(String[] args) {
            int[] array = new int[100000];
            for(int i=0;i<array.length;i++){
                array[i]=(int)(Math.random()*200000);
            }
            long t1 = System.currentTimeMillis();
            array = sort03(array);
            long t2 = System.currentTimeMillis();
            for(int i=0,j=1;i<array.length;j++,i++){
                System.out.print(array[i]+"  ");
                if(j%10==0){
                    System.out.println();
                }
            }
            System.out.println("插入排序算法耗费"+(t2-t1)+"毫秒");
        }
        public static int[] sort03(int[] array){//插入排序
            for(int i=1;i<array.length;i++){ //待插入的数据所处的位置
                int index = i-1; //是否应该插入到该位置
                int data  = array[i]; //带插入的数据
                while(index>=0&&data<array[index]){
                    array[index+1]=array[index];
                    index--;
                }
                array[index+1]=data;
            }
            return array;
        }
    }
    
    
    package com.算法.排序;
    
    public class 希尔排序 {
        //希尔排序的时间复杂度依赖于增量序列的选择,理论分析比较复杂.有实验结果表明,当n较大时,时间复杂度大约在O(n1.25)到O(n1.36)之间.
        public static void main(String[] args){
            int[] array = new int[100000];
            for(int i=0;i<array.length;i++){
              array[i] = (int) (Math.random()*200000);
            }
            long t1 = System.currentTimeMillis();
            array=sort04(array);
            long t2 = System.currentTimeMillis();
            for(int i=0,j=1;i<array.length;j++,i++){
                System.out.print(array[i]+"  ");
                if(j%10==0){
                    System.out.println();
                }
            }
            System.out.println("希尔排序算法耗费"+(t2-t1)+"毫秒");
        }
        public static int[] sort04(int[] array){ //希尔排序
            for(int i=array.length/2;i>0;i/=2){ //将数据分为i组
                for(int j=i;j<array.length;j++){
                    int index = j-i;
                    int value = array[j];
                    while(index>=0&&value<array[index]){
                        array[index+i] = array[index];
                        index -= i;
                    }
                    array[index+i] = value;
                }
            }
            return array;
        }
    }
    
    
    package com.算法.排序;
    
    public class 快速排序 {
        //时间复杂度O(nlogn)
        public static void main(String[] args) {
            int[] array = new int[100000];
            for(int i=0;i<array.length;i++){
                array[i]=(int)(Math.random()*200000);
            }
            long t1 = System.currentTimeMillis();
            array=sort05(array,0,array.length-1);
            long t2 = System.currentTimeMillis();
            for(int i=0,j=1;i<array.length;j++,i++){
                System.out.print(array[i]+"  ");
                if(j%10==0){
                    System.out.println();
                }
            }
            System.out.println("快速排序算法耗费"+(t2-t1)+"毫秒");
        }
        public static int[] sort05(int[] array,int head,int tail){ //快速排序
            int temp = array[head]; //我们选取最左边的数为基准数
            int i = head ;
            int j = tail ;
            while(i!=j){
                //我们使右边的数不小于基准数 使左边的数不大于基准数
                while(i<j&&array[j]>=temp){
                    j--;
                }
                while(i<j&&array[i]<=temp){
                    i++;
                }
                if(i<j){
                    int t = array[j] ;
                    array[j] = array[i];
                    array[i] = t;
                }
            }
            array[head] = array[i];
            array[i] = temp ;
            if(i-1>head) array=sort05(array,head,i-1);
            if(j+1<tail) array=sort05(array,j+1,tail);
            return array;
        }
    }
    
    
    package com.算法.排序;
    
    public class 归并排序 {
        //时间复杂度:O(nlogn)
        public static void main(String[] args) {
            int[] array = new int[100000];
            for(int i=0;i<array.length;i++){
                array[i] = (int)(Math.random()*200000);
            }
            long t1 = System.currentTimeMillis();
            int[] temp = new int[100000]; //归并排序需要一个额外的空间
            sort06(0,array.length-1,temp,array);
            long t2 = System.currentTimeMillis();
            for(int i=0,j=1;i<array.length;j++,i++){
                System.out.print(array[i]+"  ");
                if(j%10==0){
                    System.out.println();
                }
            }
            System.out.println("归并排序算法耗费"+(t2-t1)+"毫秒");
        }
        public static void sort06(int head,int tail,int[] temp,int[] arr){ //归并排序
            if(head<tail){
               int mid = (head+tail)/2;
                sort06(head,mid,temp,arr);
                sort06(mid+1,tail,temp,arr);
                he(arr,head,mid,tail,temp);
            }
        }
        public static void he(int[] arr,int head,int mid,int tail,int[] temp){  //合并数据时的方法
            int t = 0 ;
            int i = head ;
            int j = mid+1 ;
            while(i<=mid&&j<=tail){
                if(arr[i]<=arr[j]){
                    temp[t++]=arr[i++];
                }else{
                    temp[t++]=arr[j++];
                }
            }
            while(i<=mid){
                temp[t++]=arr[i++];
            }
            while(j<=tail){
                temp[t++]=arr[j++];
            }
            t=0;
            int index = head ;
            while(index<=tail){
                arr[index++] = temp[t++];
            }
        }
    }
    
    
    package com.算法.排序;
    
    public class 基数排序 {
        //时间复杂度:O(n*k)
        public static void main(String[] args) {
            int[] array = new int[100000];
            for(int i=0;i<array.length;i++){
                array[i] = (int)(Math.random()*200000);
            }
            long t1 = System.currentTimeMillis();
            sort07(array);
            long t2 = System.currentTimeMillis();
            for(int i=0,j=1;i<array.length;j++,i++){
                System.out.print(array[i]+"  ");
                if(j%10==0){
                    System.out.println();
                }
            }
            System.out.println("基数排序算法耗费"+(t2-t1)+"毫秒");
        }
        public static void sort07(int[] arr){ //基数排序
            int max = arr[0] ;
            for(int i=0;i<arr.length;i++){
                max = Math.max(arr[i],max);
            }
            int len = (max+"").length(); //最大的数有len位
            int[] data = new int[10]; //储存每个桶里元素的数量
            int[][] tong = new int[10][arr.length]; //10个桶 储存取出的数据
            for(int i=0,k=1;i<len;i++,k++){ //我们需要处理len次 每次取模
                for(int j=0;j<arr.length;j++){
                    int mod = arr[j]/k%10;
                    tong[mod][data[mod]++] = arr[j];
                }
                int is = 0;
                int index = 0;
                for(int j=0;j<10;j++){ //从十个桶里取出数据 存到原始数组
                    while(is<data[j]){
                        arr[index++] = tong[j][is++];
                    }
                    is = 0;
                    data[j] = 0;
                }
            }
        }
    }
    
    
    package com.算法.排序;
    
    public class 堆排序 {
        //时间复杂度O(nlogn)
        public static void main(String[] args){
            int[] arr =new int[100000];
            for(int i=0;i<arr.length;i++){
                arr[i] = (int)(Math.random()*100000);
            }
            long t1 = System.currentTimeMillis();
            for(int j=0;j<arr.length;j++){ //循环取得当前最大值
                int len = arr.length-j;//当前数组的长度
                for(int i=len/2-1;i>=0;i--){ //以i为节点向下调整
                    heapsort(arr,i,len);
                }
              //  System.out.print(arr[0]+" ");
                swap(arr,0,len-1);
            }
            long t2 = System.currentTimeMillis();
            System.out.println("堆排序算法耗费"+(t2-t1)+"毫秒");
        }
        public static void heapsort(int[] arr,int x,int len){ //在arr数组中以x为父节点向下调整
            int temp ;
            boolean flag = false ;
            int i =x;
            while((i*2+1)<len&&!flag){
                if(arr[i]<arr[i*2+1]){
                    temp = i*2+1;
                }else{
                    temp = i;
                }
                if((i*2+2)<len&&arr[temp]<arr[i*2+2]){
                    temp = i*2+2;
                }
                if(i!=temp){
                    swap(arr,i,temp);
                    i = temp;
                }else{
                    flag = true;
                }
            }
        }
        public static void swap(int[] arr ,int x,int y){ //交换数组两元素
            int temp = arr[x];
            arr[x] = arr[y];
            arr[y] = temp;
        }
    }
    
    
  • 相关阅读:
    Oracle dbms_job
    ORACLE 表空间扩展
    面试技术岗,你真能讲明白技术吗?
    阿里巴巴高级技术专家章剑锋:大数据发展的 8 个要点
    技术管理管什么
    如何做到进人精挑细选,裁人快刀斩乱麻
    数据脱敏
    美团数据治理平台
    impala教学视频
    任正非的讲话
  • 原文地址:https://www.cnblogs.com/fxzemmm/p/14847941.html
Copyright © 2011-2022 走看看