前言
今天我们将进入到算法的几种常见算法当中,我们首先介绍两种数据结构中最常用的直接插入排序和希尔排序算法;这些经典的排序算法我们必须要熟练的掌握和运用;
一、直接插入排序算法
1.1 算法思路
举例说明:
1.2 算法图解过程
1.3 算法代码
1.4 算法特征总结
二、希尔排序
2.1 算法思路
总的来说,希尔排序可以分为两个部分:
- 预排序(分组排序,使得数组尽可能趋近有序)
- 直接插入排序
举例说明:
2.2 算法图解过程
2.3 算法代码
相应的代码就是:
public class Test3 {
// 希尔排序——预排序(gap,表示分的组数)
private static void shell(int[] array, int gap) {
for (int i = gap; i < array.length; i++) {
int tmp = array[i];
int j = i - gap;
for (; j >= 0; j = j - gap) {
if (tmp < array[j]) {
array[j + gap] = array[j]; // 如果a[j]的值大于a[i](tmp),说明a[i]应该放到a[j]前面——a[j]应该向后移动
}
else {
break; // 此时说明a[j]已经在合适的位置了,不用再次移动了
}
}
array[j + gap] = tmp; // 注意这里不能等于array[i],因为经过上面array[j+gap] = array[j]数组的移动,array[i]已经发生了变化
}
}
/**
* 希尔排序——直接插入排序的优化
* @param array
*/
public static void shellSort(int[] array) {
for (int i =array. length / 3 + 1; i > 1; i = i / 3 + 1) {
shell(array, i); // 预排序,让我们排序的这个数组接近有序,这样下面的直接插入排序shell(array,1)时间效率才会高
}
shell(array, 1); // 这个相当于把数组分成一组,其实就是我们上面写的直接插入排序
}
public static void main(String[] args) {
int[] a = {9, 1, 2, 5, 7, 4, 8, 6, 3, 5};
shellSort(a);
System.out.println("排序后的数组为:" + Arrays.toString(a));
}
}
运行结果:
2.4 算法特征总结
总结
本节内容的两个算法就介绍到这里了,下一节内容我们将介绍其他两种算法,让我们继续期待下一节的内容吧!!!!!!!!!!!!!