zoukankan      html  css  js  c++  java
  • 经典算法分析:n^2与nlgn

    冒泡、插入、选择排序的时间复杂度为O(n2

    Arrays.sort()时间复杂度为nlgn

    具体算法实现代码:

      1 package recursion;
      2 
      3 import java.util.Arrays;
      4 
      5 /**
      6  * @author zsh
      7  * @company wlgzs
      8  * @create 2019-02-17 9:46
      9  * @Describe 冒泡、插入、选择排序与Arrays.sort()的性能差别
     10  */
     11 public class Main3 {
     12 
     13     /**
     14      * 冒泡排序
     15      * @param arr 待排序的数组
     16      * @return 已排序的数组
     17      */
     18     static int[] bubbleSort(int[] arr){
     19         //外层循环执行N-1趟
     20         for (int i = 0; i < arr.length -1; i++) {
     21             //内层循环执行N-1-i趟
     22             for (int j = 0; j < arr.length -1 -i ; j++) {
     23                 //如果数组前一个元素比后一个元素的值大,交换
     24                 if (arr[j] > arr[j+1]){
     25                     int temp = arr[j+1];
     26                     arr[j+1] = arr[j];
     27                     arr[j] = temp;
     28                 }
     29             }
     30         }
     31         return arr;
     32     }
     33 
     34     /**
     35      * insertSort(arr,k) 递归实现插入排序
     36      * 找重复:insertSort(arr,k-1) 将k-1个排序后,把arr[k]插入到前面的数据中 --子问题
     37      * 找变化:变化的量应该作为参数 k。
     38      * 找边界:出口 终止的条件 k == 0
     39      */
     40     static int[] insertSort(int[] arr,int k){
     41         if (k == 0){
     42             return arr;
     43         }
     44         //对前k-1个元素排序
     45         insertSort(arr,k-1);
     46         //把k位置上的元素插入到前面的部分
     47         int x = arr[k];
     48         int index = k -1;
     49         while (index >= 0 && x <arr[index]){
     50             arr[index+1] = arr[index];
     51             index--;
     52         }
     53         arr[index+1] = x;
     54         return arr;
     55     }
     56 
     57 
     58     /**
     59      * 选择排序
     60      * @param arr 待排序的数组
     61      * @return 已排序的数组
     62      */
     63     static int[] selectionSort(int[] arr){
     64         for (int i = 0; i < arr.length-1; i++) {
     65             int k = i;
     66             for (int j = i + 1; j < arr.length ; j++) {
     67                 if (arr[j] < arr[k]){
     68                     //记录此时找到最小值的位置
     69                     k = j;
     70                 }
     71             }
     72             //内层循环结束,找到最小值后进行交换
     73             if (i != k){
     74                 int temp = arr[i];
     75                 arr[i] = arr[k];
     76                 arr[k] = temp;
     77             }
     78         }
     79         return arr;
     80     }
     81 
     82     public static void main(String[] args) {
     83         //构造随机数组
     84         int[] arr = new int[10000];
     85         for (int i = 0; i < arr.length; i++) {
     86             double a = Math.random()*10000;
     87             arr[i] = (int) a;
     88         }
     89         //调用冒泡排序进行
     90         long time1 = System.currentTimeMillis();
     91         System.out.println(Arrays.toString(bubbleSort(arr)));
     92         long time2 = System.currentTimeMillis();
     93         System.out.println(time2-time1+"ms");
     94         //调用插入排序进行(使用递归)
     95         long time3 = System.currentTimeMillis();
     96         System.out.println(Arrays.toString(insertSort(arr,arr.length-1)));
     97         long time4 = System.currentTimeMillis();
     98         System.out.println(time4-time3+"ms");
     99         //调用选择排序进行
    100         long time5 = System.currentTimeMillis();
    101         System.out.println(Arrays.toString(selectionSort(arr)));
    102         long time6 = System.currentTimeMillis();
    103         System.out.println(time6-time5+"ms");
    104         //调用Arrays.sort()进行
    105         long time7 = System.currentTimeMillis();
    106         Arrays.sort(arr);
    107         long time8 = System.currentTimeMillis();
    108         System.out.println(Arrays.toString(arr));
    109         System.out.println(time8-time7+"ms");
    110     }
    111 
    112 }

    控制台输出:

  • 相关阅读:
    论url
    jquery send(data) 对data的处理
    jquery ajax 对异步队列defer与XMLHttprequest.onload的依赖
    requirejs解决异步模块加载方案
    vue 解决display与 transition冲突
    node exports与 module.exports的区别
    node js 模块分类
    写在入职初期
    入职前要学习的一些知识
    论文实验 云平台压力测试及服务器性能测试
  • 原文地址:https://www.cnblogs.com/zsh-blogs/p/10390333.html
Copyright © 2011-2022 走看看