1. 直接插入排序
插入排序是各种排序算法中较为简单的一种排序,其主要思想是:
将数组看作有序部分和无序部分,默认第一个元素是有序的。
从第二个元素开始往前插入,如果有序部分的元素大于要插入的元素,就继续向前遍历,直到碰见一个元素小于要插入的元素,这时,将要插入的元素插入该元素后面。
注意,在遍历的时候,大于要插入元素的元素一直在向后移动。
注:在这里所讲的排序是以升序为例的。
下图详细描述了插入排序的过程:
代码如下:
class InsertSort{
public void insertSort(int[] arr){
int size = arr.length;
//默认第一个数字有序,从第二个开始排序
for (int i = 1; i < size; i++){
//要排序的元素
int key = arr[i];
//有序部分的最后一个元素
int end = i - 1;
while (end >= 0 && arr[end] > key){
arr[end+1] = arr[end];
end--;
}
arr[end+1] = key;
}
}
}
public class Test {
public static void main(String[] args) {
int[] arr = {90,21,25,16,8,1};
InsertSort inSort = new InsertSort();
inSort.insertSort(arr);
for (int tmp : arr)
System.out.print(tmp + "、");
}
}
可以根据代码看出来,直接插入排序的时间复杂度是O(N^2),并没有使用额外的空间,所以它的空间复杂度是O(1),它是一种稳定的排序算法。所谓稳定就是如果数组中出现两个相同的元素,在排序完后并不会改变两个元素的位置。
适用于数据量小,并且接近有序的数组。
2. 希尔排序
希尔排序的思想和插入排序类似:
将数组分组,化大数据量为小数据量,然后用插入排序来时每组的元素有序。
组数不断减小,直到为1,这个数组就有序了。
下图详细描述了希尔排序的过程:
代码如下:
class ShellSort{
public void shellSort(int[] arr){
int gap = arr.length;
//注意,这里是大于1而不是0,因为如果大于0的话,gap为1时进去还是1,会变成死循环
while (gap > 1){
gap = gap/3+1;
for (int i = gap; i < arr.length; i++){
int key = arr[i];
int end = i - gap;
while(end >= 0 && arr[end] > key){
arr[end+gap] = arr[end];
end = end-gap;
}
arr[end+gap] = key;
}
}
}
}
public class Test {
public static void main(String[] args) {
int[] arr = {90,21,25,16,8,1};
ShellSort shSort = new ShellSort();
shSort.shellSort(arr);
for (int tmp : arr)
System.out.print(tmp + "、");
}
}
希尔排序的时间复杂度是O(N^1.3),并没有使用额外的空间,所以它的空间复杂度是O(1),它是一种不稳定的排序算法。
适用于数据量大,并且数据较为凌乱。