排序算法整理(Java)
1. 直接插入排序(Insert Sort)
1.1 思路:
1.将待排序序列分为有序区和无序区,初始时,有序区为待排序记录第一个,无序区为剩下所有。
2.将无序区的第一个记录插入到有序区合适位置中,无序区记录减一,有序区加一。
3.重复步骤2,到无序区没有记录为止。
算法适用于少量数据的排序,时间复杂度为O(n^2),是稳定的排序方法。
1.2 算法实现
/**
* 插入排序算法
* 1.将数组分为有序区和无序区,初始有序区为数组第一个记录,无序区为剩下的记录。
* 2.将无序区第一个记录插入到有序区的合适位置,有序区增加一个记录,无序区减少一个记录
* 3.重复步骤二,直至无序区无记录。
* @param array
*/
public static void InsertSort(int [] array){
for (int i = 1; i < array.length; i++) {
//第一次比较
int temp = array[i]; //记录下a[1]的值 a[1] = 64 ,无序区第一位
int j = i; // j=1
while ( j>0 && temp < array[j-1]){
//比较 有序区第一位 无序区第一位 即a[1] < a[0]时,数据前移一位 j>0 防止数据下标溢出
array[j] = array[j-1]; //a[1] = a[0]
j--; // j=0
}
array[j] = temp; //把a[1] 的值存储到 a[0] 交换完成
} //之后第二次 i=2 比较部分执行两次 因为有序区有两个元素,如此类推,最后完成排序
//printArray(array);
}
2.希尔排序(Shell Sort)
2.1 思路:
基本上和插入排序相同
区别:每次循环的步长,通过减半的方式来实现
说明:基本原理和插入排序类似,不一样的地方在于。通过间隔多个数据来进行插入排序。
算法适用于少量数据的排序,时间复杂度为取决于n,是不稳定的排序方法。