选择排序
实现思路:
1、将需排序的集合设为A,已经排好顺的集合为B(在未排序前B集合为空)。
2、每次从A集合中查找出最大或者最小的元素后放入集合B中
3、同时将该元素从集合A中移除.
4、循环执行以上两步直到集合A为空,B集合中的元素就有序了.
缺点:
效率低,时间复杂度为 O(n*n),是一种只适合小数据集的原地排序算法。
示范代码
1 | public class CommSort { |
2 | // 比较大小 |
3 | @SuppressWarnings({ "rawtypes", "unchecked" }) |
4 | public int compareElement(Comparable a, Comparable b) { |
5 | return a.compareTo(b); |
6 | } |
7 | |
8 | // 交换元素 |
9 | 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为空。
优点:
效率很高,特别对部分有序的数据集进行排序效果更好。
缺点:
适合小数据集的排序,对数据集比较大的集合进行排序效率较低。
示例代码:
1 | // 插入排序 |
2 | public <T> void InsertSort(Comparable<T>[] a) { |
3 | int len = a.length; |
4 | for (int i = 1; i < len; i++) { |
5 | for (int j = i; j > 0 && compareElement(a[j], a[j - 1]) < 0; j--) { |
6 | exchangeElement(a, j, j - 1); |
7 | } |
8 | } |
9 | } |
希尔排序
实现思路:
1、实现思路与插入排序一样,唯一的不同是希尔排序在插入排序的基础上加入了跳跃比较。
2、插入排序的跳跃步进值为一直都为1。
3、希尔排序只有最后一次的轮询比较,跳跃步进值才为1.
优缺点与插入排序一样。
示例代码:
1 | // 希尔排序 |
2 | public <T> void ShellSort(Comparable<T>[] a) { |
3 | int weight = 0; |
4 | int len = a.length; |
5 | while (weight < len / 3) { |
6 | weight = 3 * weight + 1; |
7 | } |
8 | while (weight > 0) { |
9 | 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 | } |
时间: 2024-09-30 18:39:03