zoukankan      html  css  js  c++  java
  • 数据结构(四)常用排序算法-选择、插入、希尔

    选择排序

    实现思路:

    1、将需排序的集合设为A,已经排好顺的集合为B(在未排序前B集合为空)。

    2、每次从A集合中查找出最大或者最小的元素后放入集合B中

    3、同时将该元素从集合A中移除.

    4、循环执行以上两步直到集合A为空,B集合中的元素就有序了.

    缺点:

    效率低,时间复杂度为 O(n*n),是一种只适合小数据集的原地排序算法。

    示范代码

    public class CommSort {
        // 比较大小
        @SuppressWarnings({ "rawtypes", "unchecked" })
        public int compareElement(Comparable a, Comparable b) {
            return a.compareTo(b);
        }
     
        // 交换元素
        public <T> void exchangeElement(T[] a, int i, int j) {
    10          T tmp = a[i];
    11          a[i] = a[j];
    12          a[j] = tmp;
    13      }
    14   
    15      // 选择排序
    16      public <T> void SelectionSort(Comparable<T>[] a) {
    17          int len = a.length;
    18          int minIndex = 0;
    19          for (int i = 0; i < len; i++) {
    20              minIndex = i;
    21              for (int j = i; j < len; j++) {
    22                  if (compareElement(a[j], a[minIndex]) < 0) {
    23                      minIndex = j;
    24                  }
    25              }
    26              exchangeElement(a, i, minIndex);
    27          }
    28      }
    29  }

    插入排序

    实现思路:

    1、将需排序的集合设为A,已经排好顺的集合为B(在未排序前B集合为空)。

    2、依次从集合A中获取元素并与集合B中的元素一次比较(如:按照数组下标从大到小的顺序),在集合B中找到该元素合适的位置放入(如果是升序排序,该元素应大于在它前面的元素,小于在后面的元素)

    3、循环第二步操作直到集合A为空。

    优点:

    效率很高,特别对部分有序的数据集进行排序效果更好。

    缺点:

    适合小数据集的排序,对数据集比较大的集合进行排序效率较低。

    示例代码:

    // 插入排序
    public <T> void InsertSort(Comparable<T>[] a) {
        int len = a.length;
        for (int i = 1; i < len; i++) {
            for (int j = i; j > 0 && compareElement(a[j], a[j - 1]) < 0; j--) {
                exchangeElement(a, j, j - 1);
            }
        }
    }

    希尔排序

    实现思路:

    1、实现思路与插入排序一样,唯一的不同是希尔排序在插入排序的基础上加入了跳跃比较。

    2、插入排序的跳跃步进值为一直都为1。

    3、希尔排序只有最后一次的轮询比较,跳跃步进值才为1.

    优缺点与插入排序一样。

    示例代码:

    // 希尔排序
    public <T> void ShellSort(Comparable<T>[] a) {
        int weight = 0;
        int len = a.length;
        while (weight < len / 3) {
            weight = 3 * weight + 1;
        }
        while (weight > 0) {
            for (int i = weight; i < len; i++) {
    10              for (int j = i; j >= weight
    11                      && compareElement(a[j], a[j - weight]) < 0; j -= weight) {
    12                  exchangeElement(a, j, j - weight);
    13              }
    14          }
    15          // 减小比较步进
    16          weight /= 2;
    17      }
    18  }
  • 相关阅读:
    GitHub:如何构建一个股票市场知识图谱?(附代码&链接)
    java运行jar命令提示没有主清单属性
    Modern Qt Development: The Top 10 Tools You Should Be Using
    没本事就不要去追逐梦想了
    ddd
    5分钟快速构建苹果IPA免费发布服务器
    Windows热键注册的底层原理
    云设计模式-Design patterns for microservices
    ubuntu16安装最新版docker
    什么是Docker—无服务器计算服务
  • 原文地址:https://www.cnblogs.com/jianyuan/p/5358736.html
Copyright © 2011-2022 走看看