一、插入排序
<1>、直接插入排序是一种简单的插入排序法,其基本思想是:把待排序的记录按其关键码值的大小逐个插入到一
个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列
思想十分简单,算法实现如下:
//直接插入排序 越有序插入越快
//将每一个数与前面所有排好序的数字相比较,如果大了 直接放入即可
public static void insertSort(int[] array){
for(int i=0;i<array.length;i++){
int tmp=array[i];
int j=0;
for(j=i-1;j>=0;j--){
if(array[j]>array[i]){
array[i]=array[j];
array[j]=tmp;
}
}
}
}
直接插入排序的特性总结:
- 元素集合越接近有序,直接插入排序算法的时间效率越高
- 时间复杂度:O(N^2)
- 空间复杂度:O(1),它是一种稳定的排序算法
- 稳定性:稳定
<2>、希尔排序
希尔排序是优化过后的直接插入排序,大致图解如下
具体算法实现:
//哈希排序 按组数分批次排序 是直接插入的优化
public static void shell(int[] array,int gap){//进行一趟排序
for(int i=0;i<array.length;i+=gap){
int tmp=array[i];
int j=0;
for(j=i-1;j>=0;j-=gap){
if(array[j]>array[i]){
array[i]=array[j];
array[j]=tmp;
}
}
}
}
public static void shellSort(int[] array){
int[] drr = {5,3,1};
for (int i = 0; i < drr.length; i++) {//分三趟
shell(array,drr[i]);
}
}
希尔排序的特性总结:
- 希尔排序是对直接插入排序的优化。
- 当gap > 1时都是预排序,目的是让数组更接近于有序。当gap == 1时,数组已经接近有序的了,这样就
会很快。这样整体而言,可以达到优化的效果。我们实现后可以进行性能测试的对比。 - 希尔排序的时间复杂度不好计算,需要进行推导,推导出来平均时间复杂度: O(N1.3—N2)
- 稳定性:不稳定
二、选择排序
选择排序是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的
数据元素排完。
大致图解如下:
与直接插入算法其实很类似且十分简单容易理解,算法实现如下:
public static void selectSort(int[] array){
for(int i=0;i<array.length;i++){
int tmp=array[i];
for(int j=i+1;j<array.length;j++){
if(array[j]<array[i]){
array[i]=array[j];
array[j]=tmp;
}
}
}
}
直接选择排序的特性总结:
6. 直接选择排序思考非常好理解,但是效率不是很好。实际中很少使用
7. 时间复杂度:O(N^2)
8. 空间复杂度:O(1)
9. 稳定性:不稳定