七大常见排序算法
- 直接插入排序
- 希尔排序
- 选择排序
- 堆排序
- 冒泡排序
- 快速排序
- 归并排序
下文后三种排序算法(后三种排序算法详解)
直接插入排序
算法描述:
- 定义两个下标(i 和 j).i 从第二个元素开始,j 从 i 前面开始,进行循环,
- 途中定义一个 temp ,每次循环将 i 下标的元素放到 temp 中,与 j 进行比较转换(当 j 下标的元素大于 temp 中的元素,就将 j 位置的元素赋值给后一个元素,即i下标元素,j-- 继续与 temp 比较)
- 当 j-- 到小于 temp 中的元素时,一次循环就完成了,此后 i++ 继续重复如上循环.
描述虽复杂,烦请与算法实现步骤图结合思考.
代码实现:
public class InsertSort {
public void iSort(int[] array) {
for (int i = 1; i < array.length; i++) {
// 从第二个元素开始(因为当数组只有一个元素时是有序的)
int temp = array[i]; // 设置一个 temp(为 i 下标的值) ,方便后续交换
int j = i-1; // 设置一个 j,让 j 为 i 的前一个,在循环的过程中与 temp 中的元素进行交换
for (; j >= 0; j--) {
// j 与 temp 每次比较完向前移动,继续和前一个元素进行对比
if (array[j] > temp){
// 即前一个元素(j)大于后一个元素(j+1/temp),进行交换,j --
array[j+1] = array[j]; // 将前一个元素(j)赋值给后一个元素(j+1/temp)
}else {
// 后前一个元素小于后一个元素
break; // 当前面一个元素比后面小的时候,就证明前面已经是有序的了,就不需要排序了,直接退出循环
}
} // 出循环,j--
array[j+1] = temp; // 用 temp 覆盖 j 的前一个元素
} // 出循环,i++
}
public static void main(String[] args) {
InsertSort sort = new InsertSort();
int[] array = {
12,45,32,56,8};
sort.iSort(array);
System.out.println(Arrays.toString(array));
}
}
输出结果:
稳定性:稳定
时间复杂度:O(n^2)
希尔排序
插入排序的一种优化. 每次排序前进行分组,每组采用插入排序. 每次分组会越来越少.直到分为一组
代码实现:
public class SellSort {
public void sellSort(int[] array){
int grp = array.length; // grp 为分多少组,先分 array.length 组
while (grp > 1){
// 缩小增量
sell(array,grp);
grp /&