您的位置:首页 > 理论基础 > 数据结构算法

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

2016-04-06 12:18 477 查看
选择排序

实现思路:

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  }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: