• java程序员必知的 8大排序


    Java常用的八种排序算法与代码实现

    排序问题一直是程序员工作与面试的重点,今天特意整理研究下与大家共勉!这里列出8种常见的经典排序,基本涵盖了所有的排序算法。

    1.直接插入排序

          我们经常会到这样一类排序问题:把新的数据插入到已经排好的数据列中。将第一个数和第二个数排序,然后构成一个有序序列将第三个数插入进去,构成一个新的有序序列。对第四个数、第五个数……直到最后一个数,重复第二步。如题所示:

    直接插入排序(Straight Insertion Sorting)的基本思想:在要排序的一组数中,假设前面(n-1) [n>=2] 个数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的。如此反复循环,直到全部排好顺序。

    代码:

    /**
     *
     * 基本思想:每步将一个待排序的记录,按其顺序码大小插入到前面已经排序的字序列的合适位置(从后向前找到合适位置后),直到全部插入排序完为止。
     * @author kancy
     * @version 1.0
     * @date 2019/4/1 17:31
     */
    public class InsertSort {
        public static void main(String[] args) {
            int[] ints = RandomUtil.createIntArray(0, 10, 10);
            System.out.println(Arrays.toString(ints));
            int j = 0;
            int curr = 0;
            for (int i = 0; i < ints.length; i++) {
                curr = ints[i];
                for (j = i; j > 0 ; j--) {
                    if(ints[j-1] <= curr){
                        break;
                    }
                    ints[j] = ints[j-1];
                }
                ints[j] = curr;
            }
            System.out.println(Arrays.toString(ints));
    
        }
    }

    2.希尔排序

          针对直接插入排序的下效率问题,有人对次进行了改进与升级,这就是现在的希尔排序。希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。希尔排序是非稳定排序算法。

    希尔排序是基于插入排序的以下两点性质而提出改进方法的:

    • 插入排序在对几乎已经排好序的数据操作时, 效率高, 即可以达到线性排序的效率
    • 但插入排序一般来说是低效的, 因为插入排序每次只能将数据移动一位

    如图所示:

    将数的个数设为n,取奇数k=n/2,将下标差值为k的数分为一组,构成有序序列。

    再取k=k/2 ,将下标差值为k的书分为一组,构成有序序列。

    重复第二步,直到k=1执行简单插入排序。

     

    3.简单选择排序

    常用于取序列中最大最小的几个数时。

    (如果每次比较都交换,那么就是交换排序;如果每次比较完一个循环再交换,就是简单选择排序。)

    遍历整个序列,将最小的数放在最前面。

    遍历剩下的序列,将最小的数放在最前面。

    重复第二步,直到只剩下一个数。

     

    4.堆排序

    对简单选择排序的优化。

    将序列构建成大顶堆。

    将根节点与最后一个节点交换,然后断开最后一个节点。

    重复第一、二步,直到所有节点断开

     

     

    5.冒泡排序

    很简单,用到的很少,据了解,面试的时候问的比较多!

    将序列中所有元素两两比较,将最大的放在最后面。

    将剩余序列中所有元素两两比较,将最大的放在最后面。

    重复第二步,直到只剩下一个数。

     

    6.快速排序

    要求时间最快时。

    选择第一个数为p,小于p的数放在左边,大于p的数放在右边。

    递归的将p左边和右边的数都按照第一步进行,直到不能递归。

     

    代码:

    public void quickSort(int[]a,int start,int end){
               if(start<end){
                   int baseNum=a[start];//选基准值
                   int midNum;//记录中间值
                   int i=start;
                   int j=end;
                   do{
                       while((a[i]<baseNum)&&i<end){
                           i++;
                       }
                       while((a[j]>baseNum)&&j>start){
                           j--;
                       }
                       if(i<=j){
                           midNum=a[i];
                           a[i]=a[j];
                           a[j]=midNum;
                           i++;
                           j--;
                       }
                   }while(i<=j);
                    if(start<j){
                        quickSort(a,start,j);
                    }       
                    if(end>i){
                        quickSort(a,i,end);
                    }
               }
           }

    7.归并排序

    速度仅次于快速排序,内存少的时候使用,可以进行并行计算的时候使用。

    选择相邻两个数组成一个有序序列。

    选择相邻的两个有序序列组成一个有序序列。

    重复第二步,直到全部组成一个有序序列。

     

    8.基数排序

    用于大量数,很长的数进行排序时。

    将所有的数的个位数取出,按照个位数进行排序,构成一个序列。

    将新构成的所有的数的十位数取出,按照十位数进行排序,构成一个序列。

     

    参考:

    https://www.cnblogs.com/10158wsj/p/6782124.html

    https://blog.csdn.net/without0815/article/details/7697916

    https://www.cnblogs.com/0201zcr/p/4763806.html

  • 相关阅读:
    选择适合自己的Markdown编辑器
    学习笔记
    读书笔记:Ajax/REST架构对于侵入式Web应用的优势
    scala学习之路(三)数组
    scala学习之路(二)控制结构和函数
    scala学习之路(一)基础
    Centos7下搭建Django+uWSGI+nginx基于python3
    java Date 和 数据库Date,DateTimed
    Java IO编程
    Hive内部表,外部表,分区表的创建
  • 原文地址:https://www.cnblogs.com/kancy/p/10640080.html
Copyright © 2020-2023  润新知