一、选择排序
1. 基本思想
1) 首先,在一组未排序的元素中找到最大(小)的元素,与第一个位置的元素交换;
2) 然后,在剩余未排序的元素中找到最大(小)的元素,与第二个位置的元素交换;
3) 依此类推,直到所有元素均排序完毕。
2. 实例分析
3. Java 实现
// 选择排序
public static void selection_sort(int[] a) {
for (int i = 0; i < a.length; i++) {
int min = i;
for (int j = i + 1; j < a.length; j++) {
if (a[j] < a[min]) {
min = j;
}
}
int temp = a[i];
a[i] = a[min];
a[min] = temp;
}
}
4. 复杂度分析
-- 选择排序的交换操作介于 0 和 (n-1) 次之间。
-- 选择排序的比较操作介于 n(n-1)/2 次之间。O(n^2)
-- 选择排序的赋值操作介于 0 和 3(n-1) 次之间。
1. 基本思想
一般来说,插入排序都采用 in-place 在数组上实现。
1) 从第一个元素开始,该元素可以认为已经被排序
2) 取出下一个元素,在已经排序的元素序列中从后向前扫描
3) 如果该元素(已排序)大于新元素,将该元素移到下一位置
4) 重复步骤3),直到找到已排序的元素小于或者等于新元素的位置
5) 将新元素插入到该位置后
6) 重复步骤2) - 步骤5)
2. 实例分析
3. Java 实现
public static void insertion_sort(int[] a) {
for (int i = 1; i < a.length; i++) {
int temp = a[i];
for (int j = i; j > 0 && temp < a[j-1]; j--) {
a[j] = a[j-1];
a[j-1] = temp;
}
}
}
4. 复杂度分析
时间复杂度:O(n^2)
三、希尔排序
希尔排序是基于插入排序的以下两点性质而提出改进方法的:
- 插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率
- 但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位
1. 基本思想
先将整个待排序的记录序列分割成若干个子序列,分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对整体记录进行依次直接插入排序。
1) 选择一个增量序列 t1,t2,...,tk,其中 ti > tj,tk = 1;
2) 按增量序列个数k,对序列进行 k 趟排序;
3) 每趟排序,根据对应的增量 ti,对待排序列分割成若干长度为 m 的子序列,分别对各子表进行直接插入排序。仅增量因子为1时,整个序列作为一个表来处理,表长度即为整个序列的长度。
2. 实例分析
3. Java 实现