更多精彩,请点击上方蓝字关注我们!

上次跟大家分享了下各种排序算法的分析及java实现(一)的相关知识,今天跟大家分享各种排序算法的分析及java实现(二)的知识。昨天我们讲到了选择排序,今天我们继续三、交换排序①冒泡排序 1、基本思想:在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。  2、实例

 3、java实现

  package com.sort;  //稳定  public class 冒泡排序 {      public static void main(String[] args) {          int[] a={49,38,65,97,76,13,27,49,78,34,12,64,1,8};          System.out.println("排序之前:");          for (int i = 0; i < a.length; i++) {              System.out.print(a[i]+" ");         }         //冒泡排序         for (int i = 0; i < a.length; i++) {             for(int j = 0; j                 //这里-i主要是每遍历一次都把最大的i个数沉到最底下去了,没有必要再替换了                if(a[j]>a[j+1]){                     int temp = a[j];                     a[j] = a[j+1];                     a[j+1] = temp;                 }             }         }         System.out.println();         System.out.println("排序之后:");         for (int i = 0; i < a.length; i++) {             System.out.print(a[i]+" ");         }     } }

  4、分析冒泡排序是一种稳定的排序方法。 •若文件初状为正序,则一趟起泡就可完成排序,排序码的比较次数为n-1,且没有记录移动,时间复杂度是O(n)•若文件初态为逆序,则需要n-1趟起泡,每趟进行n-i次排序码的比较,且每次比较都移动三次,比较和移动次数均达到最大值∶O(n2)•起泡排序平均时间复杂度为O(n2)

②快速排序

  1、基本思想:

选择一个基准元素,通常选择第一个元素或者最后一个元素,通过一趟扫描,将待排序列分成两部分,一部分比基准元素小,一部分大于等于基准元素,此时基准元素在其排好序后的正确位置,然后再用同样的方法递归地排序划分的两部分。

  2、实例

  3、java实现

package com.sort;//不稳定public class 快速排序 {    public static void main(String[] args) {        int[] a={49,38,65,97,76,13,27,49,78,34,12,64,1,8};        System.out.println("排序之前:");        for (int i = 0; i < a.length; i++) {            System.out.print(a[i]+" ");        }        //快速排序        quick(a);        System.out.println();        System.out.println("排序之后:");        for (int i = 0; i < a.length; i++) {            System.out.print(a[i]+" ");        }    }    private static void quick(int[] a) {        if(a.length>0){            quickSort(a,0,a.length-1);        }    }    private static void quickSort(int[] a, int low, int high) {        if(low            int middle = getMiddle(a,low,high);            quickSort(a, 0, middle-1);            quickSort(a, middle+1, high);        }    }    private static int getMiddle(int[] a, int low, int high) {        int temp = a[low];//基准元素        while(low            //找到比基准元素小的元素位置            while(low=temp){                high--;            }            a[low] = a[high];             while(low                low++;            }            a[high] = a[low];        }        a[low] = temp;        return low;    }}

 4、分析快速排序是不稳定的排序。快速排序的时间复杂度为O(nlogn)。当n较大时使用快排比较好,当序列基本有序时用快排反而不好。

四、归并排序

  1、基本思想:

归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。

  2、实例

  3、java实现

 package com.sort;  //稳定  public class 归并排序 {      public static void main(String[] args) {         int[] a={49,38,65,97,76,13,27,49,78,34,12,64,1,8};          System.out.println("排序之前:");          for (int i = 0; i < a.length; i++) {              System.out.print(a[i]+" ");         }         //归并排序         mergeSort(a,0,a.length-1);         System.out.println();         System.out.println("排序之后:");         for (int i = 0; i < a.length; i++) {             System.out.print(a[i]+" ");         }     }     private static void mergeSort(int[] a, int left, int right) {         if(left             int middle = (left+right)/2;             //对左边进行递归             mergeSort(a, left, middle);             //对右边进行递归             mergeSort(a, middle+1, right);             //合并             merge(a,left,middle,right);         }     }     private static void merge(int[] a, int left, int middle, int right) {         int[] tmpArr = new int[a.length];         int mid = middle+1; //右边的起始位置         int tmp = left;         int third = left;         while(left<=middle && mid<=right){             //从两个数组中选取较小的数放入中间数组             if(a[left]<=a[mid]){                 tmpArr[third++] = a[left++];             }else{                 tmpArr[third++] = a[mid++];             }         }         //将剩余的部分放入中间数组         while(left<=middle){             tmpArr[third++] = a[left++];         }         while(mid<=right){             tmpArr[third++] = a[mid++];         }         //将中间数组复制回原数组         while(tmp<=right){             a[tmp] = tmpArr[tmp++];         }     } }

  4、分析

归并排序是稳定的排序方法。归并排序的时间复杂度为O(nlogn)。速度仅次于快速排序,为稳定排序算法,一般用于对总体无序,但是各子项相对有序的数列。

五、基数排序

  1、基本思想:

将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后,数列就变成一个有序序列。

  2、实例

  3、java实现

 package com.sort;  import java.util.ArrayList;  import java.util.List;  //稳定  public class 基数排序 {      public static void main(String[] args) {          int[] a={49,38,65,97,176,213,227,49,78,34,12,164,11,18,1};          System.out.println("排序之前:");         for (int i = 0; i < a.length; i++) {             System.out.print(a[i]+" ");         }         //基数排序         sort(a);         System.out.println();         System.out.println("排序之后:");         for (int i = 0; i < a.length; i++) {             System.out.print(a[i]+" ");         }     }     private static void sort(int[] array) {         //找到最大数,确定要排序几趟         int max = 0;         for (int i = 0; i < array.length; i++) {             if(max                 max = array[i];             }         }         //判断位数         int times = 0;         while(max>0){            max = max/10;             times++;         }         //建立十个队列         List queue = new ArrayList();        for (int i = 0; i < 10; i++) {            ArrayList queue1 = new ArrayList();             queue.add(queue1);       }         //进行times次分配和收集         for (int i = 0; i < times; i++) {             //分配             for (int j = 0; j < array.length; j++) {                 int x = array[j]%(int)Math.pow(10, i+1)/(int)Math.pow(10, i);                 ArrayList queue2 = queue.get(x);                 queue2.add(array[j]);                 queue.set(x,queue2);             }             //收集             int count = 0;             for (int j = 0; j < 10; j++) {                 while(queue.get(j).size()>0){                     ArrayList queue3 = queue.get(j);                     array[count] = queue3.get(0);                     queue3.remove(0);                     count++;                 }             }         }     } }

  4、分析

  基数排序是稳定的排序算法。

  基数排序的时间复杂度为O(d(n+r)),d为位数,r为基数。

总结:

一、稳定性:

稳定:冒泡排序、插入排序、归并排序和基数排序不稳定:选择排序、快速排序、希尔排序、堆排序

二、平均时间复杂度

O(n^2):直接插入排序,简单选择排序,冒泡排序。

在数据规模较小时(9W内),直接插入排序,简单选择排序差不多。当数据较大时,冒泡排序算法的时间代价最高。性能为O(n^2)的算法基本上是相邻元素进行比较,基本上都是稳定的。

O(nlogn):快速排序,归并排序,希尔排序,堆排序。

其中,快排是最好的, 其次是归并和希尔,堆排序在数据量很大时效果明显。

三、排序算法的选择

  1.数据规模较小

  (1)待排序列基本序的情况下,可以选择直接插入排序;

  (2)对稳定性不作要求宜用简单选择排序,对稳定性有要求宜用插入或冒泡

  2.数据规模不是很大

  (1)完全可以用内存空间,序列杂乱无序,对稳定性没有要求,快速排序,此时要付出log(N)的额外空间。

  (2)序列本身可能有序,对稳定性有要求,空间允许下,宜用归并排序

  3.数据规模很大

  (1)对稳定性有求,则可考虑归并排序。

  (2)对稳定性没要求,宜用堆排序

  4.序列初始基本有序(正序),宜用直接插入,冒泡

图文 / 来源网络

版权归原作者所有,侵联删

END

碧茂课堂精彩课程推荐:

1.Cloudera数据分析课;

2.Spark和Hadoop开发员培训;

3.大数据机器学习之推荐系统;

4.Python数据分析与机器学习实战;

详情请关注我们公众号:碧茂大数据-课程产品-碧茂课堂

现在注册互动得海量学币,大量精品课程免费送!

关注最新行业动态,

加群进行技术交流!

dv算法java实现_各种排序算法的分析及java实现(二)相关推荐

  1. prim算法适用条件_内部排序算法的比较及应用

    "内部排序包括        插入排序(直接插入排序.折半插入排序.希尔排序),        交换排序(冒泡排序.快速排序),        选择排序(简单选择排序.堆排序),       ...

  2. 排序算法python实现_合并排序算法– Java,C和Python实现

    排序算法python实现 Merge sort is one of the most efficient sorting algorithms. It works on the principle o ...

  3. 归并排序 java 迭代_经典排序算法之归并排序(示例代码)

    归并排序(英语:Merge sort,或mergesort),是创建在归并操作上的一种有效的排序算法,效率为 (大O符号).1945年由约翰·冯·诺伊曼首次提出.该算法是采用分治法(Divide an ...

  4. 距离矢量路由算法的java代码_八大排序算法比较(附Java代码)

    冒泡排序 /*** 冒泡排序 比较好理解* 两两相比 较大的放后面* 时间复杂度O(n^2)*//*** 改进前的冒泡排序算法进行100,000数据排序运行时间为:3829ms* 优化后的冒泡排序算法 ...

  5. java火山_各种排序算法java实现

    插入排序: package org.rut.util.algorithm.support; import org.rut.util.algorithm.SortUtil; /** * @author ...

  6. 冒泡和快速排序的时间复杂度_八大排序算法性能分析及总结

    一.排序算法说明 排序的定义:对一个无序的序列进行排序的过程. 输入:n个数:a1,a2,a3,-,an. 输出:n个数的排列:a1,a2,a3,-,an,使得a1<=a2<=a3< ...

  7. java冒泡排序_Java专题(二):Java中常见的排序算法有哪些?---冒泡排序

    排序相关的的基本概念排序: 将一组杂乱无章的数据按一定的规律顺次排列起来. 数据表( data list): 它是待排序数据对象的有限集合. 排序码(key):通常数据对象有多个属性域,即多个数据成员 ...

  8. Java 提供的默认排序算法

    Java 提供的默认排序算法. 这个问题本身就是有点陷阱的意味,因为需要区分是 Arrays.sort() 还是 Collections.sort() (底层是调用 Arrays.sort()):什么 ...

  9. Java数据结构第一讲-排序算法

    常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构) 数据结构和算法作为程序员的基本功,一定得稳扎稳打的学习,我们常见的框架底层就是各类数据 ...

最新文章

  1. Spring框架在属性注入时@Autowired和@Resource的区别
  2. 进程间的通信IPC(无名管道和命名管道)
  3. Lombok@Builder和@NoArgsConstructor冲突
  4. 错误:docker-ce-cli conflicts with 2:docker-1.13.1-103.git7f2769b.el7.centos.x86_64 错误:docker-ce confli
  5. js预览本地word文档_怎么免费下载百度文库付费文档?
  6. SpringBoot实战(八):集成Swagger
  7. 3dmax 计算机中丢失,3DMax如何找回丢失的3D命令面板或工具栏
  8. Latex个人常用清单--不断更新
  9. python切换环境_Python 版本环境切换工具
  10. 离线版MSDN下载地址
  11. 神器 git clean
  12. [转载]Word 插入脚注后分节符自动变成分页符解决办法
  13. PC微信多开,超简单
  14. ffmpeg v4l2集成分析
  15. IP-guard苹果加密软件|苹果系统加密|Mac文档加密软件
  16. Linux命令之统计文件字数、字符数、字节数及行数信息wc
  17. 云服务器一键搭建脚本
  18. linux电脑系统桌面文件怎么恢复出厂设置密码,树莓派如何恢复LXPanel面板默认设置-恢复出厂设置英文...
  19. 使用低代码平台 - 危险的赌注
  20. 0x00007FF73DF2C2EB 处(位于 PCL中)引发的异常: 0xC0000005: 读取位置 0x0000000000000000 时发生访问冲突。

热门文章

  1. 用TF实现线性回归模型。
  2. 53. Maximum Subarray 题解
  3. 腾讯四季度数实经济收入首超游戏达479.58亿元
  4. 特斯拉柏林超级工厂最终环保审批结果有望周五揭晓
  5. 小米平板5系列共三款机型:全系搭载2K/120Hz屏幕
  6. 一汽大众汽车宣布召回19.1万辆国产奥迪A6L
  7. 腾讯申请自动驾驶相关专利 可实现自动变道
  8. 四款机型全面开售 海蓝色iPhone 12 Pro最受欢迎
  9. 理想汽车,重新定义“召回”
  10. TikTok欧洲首个数据中心将建在爱尔兰 投资5亿美元