数据结构常用排序算法-选择插入希尔

Posted 会飞的纸盒

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构常用排序算法-选择插入希尔相关的知识,希望对你有一定的参考价值。

选择排序

实现思路:

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  }

以上是关于数据结构常用排序算法-选择插入希尔的主要内容,如果未能解决你的问题,请参考以下文章

2-算法基础

《算法》笔记 3 - 选择排序插入排序希尔排序

2.C++-选择排序冒泡排序插入排序希尔排序归并排序快速排序

知识分享:数据结构常用 7 种排序算法(无基数排序)

理解插入排序,希尔排序,选择排序的算法原理

图解程序员必须掌握的Java常用8大排序算法