zoukankan      html  css  js  c++  java
  • 排序算法实现与分析(冒泡排序,选择排序,插入排序,自底向上归并排序),Echarts可视化结果

    要求:随机生成排序所用100000个实数,生成的数以数组的形式存储

       记录各排序方法所需排序时间

       重复进行3次运算后取出平均耗时做比较

       以柱状图的形式展示结果,分析结果

    主程序:

      1 import java.util.Random;
      2 import javax.swing.JFrame;
      3 
      4 public class test extends JFrame{
      5     
      6     //随机100000个生成数据
      7     public static double[] data() {
      8         Random random = new Random();
      9         double[] arr=new double[100000];
     10         for(int i=0;i<100000;i++) {
     11             arr[i]=random.nextDouble();
     12         }
     13         return arr;
     14     }
     15     
     16     //冒泡排序
     17     public static void bubbleSort(double[] arr) {
     18         double temp;//定义一个临时变量
     19         for(int i=0;i<arr.length-1;i++){//趟数
     20             for(int j=0;j<arr.length-i-1;j++){
     21                 //若后面个数据小,则交换两个元素
     22                 if(arr[j+1]<arr[j]){
     23                     temp = arr[j];
     24                     arr[j] = arr[j+1];
     25                     arr[j+1] = temp;
     26                 }
     27             }
     28         }
     29     }
     30     
     31     //选择排序
     32     public static void selectionSort(double[] arr) {
     33         for(int i=0; i<arr.length; i++) {
     34             int minIndex = i;//最小数索引
     35             for(int j=i; j<arr.length; j++) {
     36                 //找最小数,并记录最小数的索引
     37                 if(arr[j] < arr[minIndex]) {
     38                     minIndex = j;
     39                 }
     40             }
     41             //交换符合条件的数
     42             double tmp = arr[i];
     43             arr[i] = arr[minIndex];
     44             arr[minIndex] = tmp;
     45         }
     46     }
     47     
     48     //插入排序
     49     public static void insertionSort(double[] arr) {
     50         int j=0;
     51         for(int i=1;i<arr.length;i++) {
     52             double temp=arr[i]; //temp存放将要插入的数据
     53             if(arr[i]<arr[i-1]) {
     54                 for( j=i-1;j>=0&&arr[j]>temp;j--) {
     55                     arr[j+1]=arr[j];
     56                     //temp的位置空出来,把第j个的值赋给第j+1个;
     57                 }
     58                 arr[j+1]=temp;
     59             }
     60         }
     61     }
     62     
     63     //自底向上归并排序
     64     public static void sortDownToUp(double[] arr) {
     65         double[] aux = new double[arr.length];
     66         for (int sz = 1; sz < arr.length; sz *= 2) {
     67             for (int start = 0; start < arr.length - sz; start += 2 * sz) {
     68                 int end=Math.min(start + 2 * sz - 1, arr.length - 1);
     69                 int mid=start + sz - 1;
     70                 //按照长度归并回arr数组,归并后长度翻倍
     71                 for (int k = start; k <= end; k++) {
     72                     aux[k] = arr[k];
     73                 }
     74                 int i = start, j = mid + 1;
     75                 //[start,mid] [mid+1, end]
     76                 for (int k = start; k <= end; k++) {
     77                     if (i > mid) {
     78                         arr[k] = aux[j++];
     79                     } else if (j > end) {
     80                         arr[k] = aux[i++];
     81                     } else if (aux[j] < aux[i]) {
     82                         arr[k] = aux[j++];
     83                     } else {
     84                         arr[k] = aux[i++];
     85                     }
     86                 }
     87             }
     88         }
     89     }
     90 
     91 //    主函数
     92     public static void main(String[] args) {
     93         // TODO Auto-generated method stub
     94         
     95         double starttime,endtime;
     96         double[] arr=data();//生成数据
     97 
     98         //3次运行对比
     99         double[] b_time=new double[3];
    100         double[] s_time=new double[3];
    101         double[] i_time=new double[3];
    102         double[] d_time=new double[3];
    103         double[] avartime=new double[4];//平均运行时间
    104 
    105         for(int i=0;i<3;i++) {
    106             double[] b_arr=arr.clone();
    107             double[] s_arr=arr.clone();
    108             double[] i_arr=arr.clone();
    109             double[] d_arr=arr.clone();
    110 
    111             starttime=System.currentTimeMillis();
    112             bubbleSort(b_arr);//冒泡排序
    113             endtime=System.currentTimeMillis();
    114             b_time[i]=(endtime-starttime)/1000.0;//耗时
    115             
    116             starttime=System.currentTimeMillis();
    117             selectionSort(s_arr);//选择排序
    118             endtime=System.currentTimeMillis();
    119             s_time[i]=(endtime-starttime)/1000.0;//耗时
    120             
    121             starttime=System.currentTimeMillis();
    122             insertionSort(i_arr);//插入排序
    123             endtime=System.currentTimeMillis();
    124             i_time[i]=(endtime-starttime)/1000.0;//耗时
    125             
    126             starttime=System.currentTimeMillis();
    127             sortDownToUp(d_arr);//自底向上归并排序
    128             endtime=System.currentTimeMillis();
    129             d_time[i]=(endtime-starttime)/1000.0;//耗时
    130         }
    131         //平均运行时间
    132         avartime[0]=(b_time[0]+b_time[1]+b_time[2])/3;
    133         avartime[1]=(s_time[0]+s_time[1]+s_time[2])/3;
    134         avartime[2]=(i_time[0]+i_time[1]+i_time[2])/3;
    135         avartime[3]=(i_time[0]+i_time[1]+i_time[2])/3;
    136 
    137         System.out.println("冒泡排序	选择排序	插入排序	归并排序");
    138         for(int j=0;j<3;j++) {
    139             System.out.println(b_time[j]+"s	"+s_time[j]+"s	"+i_time[j]+"s	"+d_time[j]+"s");
    140         }
    141         System.out.println("平均时间:");
    142 
    143             System.out.println(avartime[0]+"s	"+avartime[1]+"s	"+avartime[2]+"s	"+avartime[3]+"s	");
    144 
    145 
    146 
    147     }
    148 
    149 }

    运行结果(每次运行都不同):

    可视化图表程序(Echarts图表库):

      1 var posList = [
      2     'left', 'right', 'top', 'bottom',
      3     'inside',
      4     'insideTop', 'insideLeft', 'insideRight', 'insideBottom',
      5     'insideTopLeft', 'insideTopRight', 'insideBottomLeft', 'insideBottomRight'
      6 ];
      7 
      8 app.configParameters = {
      9     rotate: {
     10         min: -90,
     11         max: 90
     12     },
     13     align: {
     14         options: {
     15             left: 'left',
     16             center: 'center',
     17             right: 'right'
     18         }
     19     },
     20     verticalAlign: {
     21         options: {
     22             top: 'top',
     23             middle: 'middle',
     24             bottom: 'bottom'
     25         }
     26     },
     27     position: {
     28         options: echarts.util.reduce(posList, function (map, pos) {
     29             map[pos] = pos;
     30             return map;
     31         }, {})
     32     },
     33     distance: {
     34         min: 0,
     35         max: 100
     36     }
     37 };
     38 
     39 app.config = {
     40     rotate: 90,
     41     align: 'left',
     42     verticalAlign: 'middle',
     43     position: 'insideBottom',
     44     distance: 15,
     45     onChange: function () {
     46         var labelOption = {
     47             normal: {
     48                 rotate: app.config.rotate,
     49                 align: app.config.align,
     50                 verticalAlign: app.config.verticalAlign,
     51                 position: app.config.position,
     52                 distance: app.config.distance
     53             }
     54         };
     55         myChart.setOption({
     56             series: [{
     57                 label: labelOption
     58             }, {
     59                 label: labelOption
     60             }, {
     61                 label: labelOption
     62             }, {
     63                 label: labelOption
     64             }]
     65         });
     66     }
     67 };
     68 
     69 var labelOption = {
     70     normal: {
     71         show: true,
     72         position: app.config.position,
     73         distance: app.config.distance,
     74         align: app.config.align,
     75         verticalAlign: app.config.verticalAlign,
     76         rotate: app.config.rotate,
     77         formatter: '{c}  {name|{a}}',
     78         fontSize: 16,
     79         rich: {
     80             name: {
     81                 textBorderColor: '#fff'
     82             }
     83         }
     84     }
     85 };
     86 
     87 option = {
     88     color: ['#003366', '#006699', '#4cabce', '#e5323e'],
     89     tooltip: {
     90         trigger: 'axis',
     91         axisPointer: {
     92             type: 'shadow'
     93         }
     94     },
     95     legend: {
     96         data: ['Forest', 'Steppe', 'Desert', 'Wetland']
     97     },
     98     toolbox: {
     99         show: true,
    100         orient: 'vertical',
    101         left: 'right',
    102         top: 'center',
    103         feature: {
    104             mark: {show: true},
    105             dataView: {show: true, readOnly: false},
    106             magicType: {show: true, type: ['line', 'bar', 'stack', 'tiled']},
    107             restore: {show: true},
    108             saveAsImage: {show: true}
    109         }
    110     },
    111     calculable: true,
    112     xAxis: [
    113         {
    114             type: 'category',
    115             axisTick: {show: false},
    116             data: ['冒泡排序', '选择排序', '插入排序', '归并排序']
    117         }
    118     ],
    119     yAxis: [
    120         {
    121             type: 'value'
    122         }
    123     ],
    124     series: [
    125         {
    126             name: '第一次',
    127             type: 'bar',
    128             barGap: 0,
    129             label: labelOption,
    130             data: [28.834, 6.102, 1.32, 0.024]
    131         },
    132         {
    133             name: '第二次',
    134             type: 'bar',
    135             label: labelOption,
    136             data: [24.789, 7.305, 1.21, 0.012]
    137         },
    138         {
    139             name: '第三次',
    140             type: 'bar',
    141             label: labelOption,
    142             data: [19.88, 2.661, 2.412,0.023]
    143         },
    144         {
    145             name: '平均时间',
    146             type: 'bar',
    147             label: labelOption,
    148             data: [24.501, 5.356, 1.6473]
    149         }
    150 ]
    151 };

    图表:

    优缺点比较:

     1.胃泡排序

      (1)基本原理

        在要排序的一-组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较,让
      较大的数往下沉,较小的往上冒。即:每当两相邻的数比较后发现他们的排序与排序要求相反时,就将他们互换。

      (2)优缺点
        优点:稳定性小
        缺点:慢,每次只能移动两个相邻的数据;


    2.简单选择排序
      (1)基本思想
        第一趟:从第一个记录开始,将后面n-1个记录进行比较,找到其中最小的记录和第一一个记录进行交换; 
        第二趟:从第二个记录开始,将后面n-2个记录进行比较,找到其中最小的记录和第2个记录进行交换; 
        第i趟:从第i个记录开始,将后面n-i个记录进行比较,找到其中最小的记录和第i个记录进行交换; 
        以此类推,经过n-1趟比较,将n-1个记录排到位,剩下一个最大记录直接排在最后; 

     

    3.插入排序4
      (1)基本思想
        将一个记录插入到已排序好的有序表中,从而得到一个新的,记录数增1的有序表。即先将序列的第一个
        记录看成是一个有序的子序列,然后从第二个记录逐个进行插入,直至整个序列有序为止。
      (2)优缺点
        优点:稳定,快
        缺点:比较次数不一定,比较次数越少,插入点后的数据移动越多,特别是数据量庞大的时候


    4.归并排序
      (1)基本思想
        首先将初始序列的n个记录看成是n个有序的子序列,每个子序列的长度为1,然后两两归并,得到n/2个

        长度为2的有序子序列,在此基础上,再对长度为2的有序子序列进行两两归并,得到若干个长度为4的
        有序子序列,以此类推,直到得到一个长度为n的有序序列为止;小
      (2)适用场景
        若n较大,并且要求排序稳定,则可以选择归并排序; 

  • 相关阅读:
    Android底部菜单栏的两种实现方式 附完整源码
    如何创建WebView
    实现 unity MonoBehaviour API5.4 的消息
    linux常用命令2
    Mac 自带的Apache php 狼神的
    高频sql语句汇总。不断更新。。
    4.数据库mysql相关
    Android keystore文件查看应用签名md5
    Java 多线程进阶-并发协作控制
    Java 多线程进阶-并发数据结构
  • 原文地址:https://www.cnblogs.com/FYZHANG/p/11673577.html
Copyright © 2011-2022 走看看