• 算法准备一


      好久没有写博文了,但是每天都关注着博文,今天想想是8月1日,来重新启动自己的博文,过完这个暑假就要开始找工作了,因此从算法开始吧:

       今天讨论的是JAVA系统内部的排序和冒泡排序,以及快速排序,因为冒泡排序和快速排序都是属于交换排序的所以一起研究一下:

    1.首先看的是系统内部提供的排序:java.util.Arrays.sort()排序:

    其里面使用了两种排序方法,快速排序和优化的合并排序。【以下引用他人的话:】

    快速排序主要是对哪些基本类型数据(int,short,long等)排序, 而合并排序用于对对象类型进行排序。
    使用不同类型的排序算法主要是由于快速排序是不稳定的,而合并排序是稳定的。这里的稳定是指比较相等的数据在排序之后仍然按照排序之前的前后顺序排列。对于基本数据类型,稳定性没有意义,而对于对象类型,稳定性是比较重要的,因为对象相等的判断可能只是判断关键属性,最好保持相等对象的非关键属性的顺序与排序前一直;另外一个原因是由于合并排序相对而言比较次数比快速排序少,移动(对象引用的移动)次数比快速排序多,而对于对象来说,比较一般比移动耗时。
    补充一点合并排序的时间复杂度是n*logn, 快速排序的平均时间复杂度也是n*logn,但是合并排序的需要额外的n个引用的空间。

     

    2.冒泡排序:冒泡排序是最简单的一种排序,思路很简单:这里就不啰嗦了。

    3.快速排序:是利用的左右left,right来不断分割来实现的,具体见代码如下:

       注:因为数据量小,所以基本上耗时看不出来,数据量大的时候是可以看出来的。

      

      1 package cn.mdj.test3;
      2 
      3 import java.util.Arrays;
      4 import java.util.Random;
      5 
      6 public class BubbleSort {
      7 
      8     /**
      9      * 实例1:
     10      * @param args
     11      * @throws Exception 
     12      */
     13     public static void main(String[] args) throws Exception {
     14         
     15         for(int i = 1;i < 5; i++){
     16             int[] arr = new int[10];
     17             int min = 100;
     18             int max = 500;
     19             //产生100-500内的随机数
     20             Random random = new Random(); 
     21             for(int j=0;j<10;j++){
     22                 arr[j] = random.nextInt(max)%(max-min+1) + min;    
     23             }
     24             System.out.println("");
     25             System.out.println("\n第"+i+"次:");
     26             long start = System.currentTimeMillis();
     27             Arrays.sort(arr);
     28             long end = System.currentTimeMillis();
     29             System.out.println("内部排序耗时:"+ (end-start));
     30             System.out.println("前十个元素为:");
     31             for(int z=0;z<arr.length;z++){
     32                 System.out.print(arr[z]+"、");
     33             }
     34             /*
     35             start = System.currentTimeMillis();
     36             Bubblesort(arr);
     37             end = System.currentTimeMillis();
     38             
     39             System.out.println("");
     40             System.out.println("冒泡排序耗时:"+ (end-start));
     41             System.out.println("前十个元素为:");
     42             for(int z=0;z<arr.length;z++){
     43                 System.out.print(arr[z]+"、");
     44             }
     45             */
     46             start = System.currentTimeMillis();
     47             QuickSort(arr,0,arr.length-1);
     48             end = System.currentTimeMillis();
     49             System.out.println("");
     50             System.out.println("快速排序耗时:"+ (end-start));
     51             System.out.println("前十个元素为:");
     52             for(int z=0;z<arr.length;z++){
     53                 System.out.print(arr[z]+"、");
     54             }
     55         }
     56     }
     57     
     58     /**
     59      * 冒泡排序:
     60      * @param arr
     61      */
     62     public static void Bubblesort(int[] arr){
     63         int temp;
     64         for(int i=0;i<arr.length - 1;i++){
     65             for(int j=arr.length-1;j > i ; j--){
     66                 if(arr[j-1] > arr[j]){
     67                     temp = arr[j-1];
     68                     arr[j-1] = arr[j];
     69                     arr[j] = temp;
     70                 }
     71             }
     72         }
     73     }
     74     
     75     /**
     76      * 快速排序:
     77      * @param arr
     78      * @param start
     79      * @param end
     80      */
     81     public static void QuickSort(int[] arr,int start,int end){
     82         int left = start;
     83         int right = end;
     84         int baseNum = arr[start];
     85         while(left<right){
     86             while(left<right && arr[right] >= baseNum){
     87                 right--;
     88             }
     89             if(left<right){
     90                 arr[left] = arr[right];
     91                 left++;
     92             }
     93             while(left<right && arr[left] <= baseNum){
     94                 left++;
     95             }
     96             if(left<right){
     97                 arr[right] = arr[left];
     98                 right--;
     99             }
    100         }
    101         
    102         arr[left] = baseNum;
    103         
    104         if(start < left){
    105             QuickSort(arr,start,left-1);
    106         }
    107         if(right < end){
    108             QuickSort(arr,right+1,end);
    109         }
    110     }
    111 }


      因为今天很忙,还有其它事情,暂时就先简单写一下吧,具体的算法思想其实任何一本数据结构里面应该都有的。

     

     

     

     

     

  • 相关阅读:
    一张图带你了解数据分析的完整流程,建议收藏
    【Unnatural × Lemon × 武汉】如果病毒结束了,你最想干什么事
    两万字深度介绍分布式系统原理!【收藏版】
    ETL的基础知识,看完你就全明白了!
    Java最大不重复子串
    一文速懂利用python字典的引用传递实现循环套娃(嵌套)
    ETSI GS MEC 015,MEP 带宽管理 API
    laravel 5.5 ajax返回错误信息
    laravel 5.5 ajax返回错误信息
    从实践出发:微服务布道师告诉你Spring Cloud与Boot他如何选择
  • 原文地址:https://www.cnblogs.com/pony1223/p/2619101.html
Copyright © 2020-2023  润新知