**
1.直接插入排序
**(Straight Insertion Sort)
是一种最简单的排序方法,其基本操作是将一条记录插入到已排好的有序表中,从而得到一个新的、记录数量增1的有序表。
具体算法描述:
- 从第一个元素开始,该元素可以认为已经被排序。
- 取出下一个元素,在已排序元素中从后向前扫描。
- 如果该元素大于新元素,将该元素移向下一个位置。
- 重复步骤三,直到找到已排元素小于或等于新元素的位置。
- 将新元素插入该位置。
- 重复步骤2~5。
一组数据:5,2,4,6,1,3
代码实现:
import java.util.Arrays;
public class InsertSort {
public static void main(String[] args) {
int[] arr = new int[] {5,3,2,8,5,9,1,0};
insertSort(arr);
System.out.println(Arrays.toString(arr));
}
private static void insertSort(int[] arr){
//遍历所有数字
for (int i = 1; i <arr.length ; i++) {
//如果当前数字比前一个数字小
if (arr[i]<arr[i-1]){
//把当前遍历的数字(insertNum)存起来
int insertNum=arr[i];
int j=0;
//遍历当前数字前面所有的数字
for(j=i-1;j>=0&&arr[j]>insertNum;j--){
//把前一个数字赋给后一个数字
arr[j+1]=arr[j];
}
//把临时变量(外层for循环的当前元素)赋给不满足条件的后一个元素
arr[j+1]=insertNum;
}
}
}
}
直接插入排序的特性总结:
- 元素集合越接近有序,直接插入排序算法的时间效率越高
- 时间复杂度:O(N^2)
- 空间复杂度:O(1),它是一种稳定的排序算法
- 稳定性:稳定
2.希尔排序
希尔排序法
是针对直接插入排序算法的改进。该方法又称缩小增量排序。
基本思想
- 先取一个小于n的整数d1作为第一个增量
- 把文件的全部记录分成d1个组。
- 所有距离为dl的倍数的记录放在同一个组中。
- 先在各组内进行直接插人排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量dt=1(dt<dt-l<…<d2<d1),即所有记录放在同一组中进行直接插入排序为止。
一组数据:9,1,2,5,7,4,8,6,3,5
import java.util.Arrays;
public class ShellSort {
public static void main(String[] args) {
int[] arr = new int[] {9,1,2,5,7,4,8,6,3,5};
System.out.println(Arrays.toString(arr));
shellSort(arr);
System.out.println(Arrays.toString(arr));
}
private static void shellSort(int[] arr){
// 遍历所有的步长
for (int d = arr.length / 2; d > 0; d /= 2) {
// 遍历所有有元素
for (int i = d; i < arr.length; i++) {
// 遍历本组中所有的元素
for (int j = i-d; j >= 0; j -= d) {
// 如果当前元素大于加上步长后的那个元素
if (arr[j] > arr[j + d]) {
int temp = arr[j];
arr[j] = arr[j + d];
arr[j + d] = temp;
}
}
}
}
}
}
希尔排序的特性总结:
- 希尔排序是对直接插入排序的优化。
- 当gap > 1时都是预排序,目的是让数组更接近于有序。当gap == 1时,数组已经接近有序的了,这样就会很快。这样整体而言,可以达到优化的效果。我们实现后可以进行性能测试的对比。
- 希尔排序的时间复杂度不好计算,需要进行推导,推导出来平均时间复杂度: O(N1.3—N2)
- 稳定性:不稳定