插入排序
直接插入排序
直接插入排序是一种最简单的排序方法,它的基本操作是将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增一的有序表。
整个排序过程为进行n-1趟插入,即:先将序列中的第一个记录看成是一个有序的子序列,然后从第二个记录起逐个进行插入,直至整个序列变成按关键字非递减有序序列为止。
JAVA代码实现:
public static void insertSort(int[] elements){
for(int i = 1;i <elements.length; i++){
int j = -1;
while(j <= i && elements[i] > elements[++j]);//找到element[i]应该摆放的位置,此处可以利用查找算法进行优化
if(j < i){
//将j之后的数据移动一位,然后把elements[i]移动到j处
int temp = elements[i];
for(int k = i-1;k >= j;k--){
elements[k+1] = elements[k];
}
elements[j] = temp;
}
}
}
说明:直接插入排序的时间复杂度为O(n²),该排序方法是稳定的。
希尔排序(Shell Sort)
希尔排序又称“缩小增量排序”,它也是一种属插入排序类的方法.
它的基本思想是:先将整个待排记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行一次直接插入排序。
JAVA代码实现:
public static void shellSort(int[] elements){
for(int h = elements.length/2;h > 0;h /= 2){
for(int i = h;i < elements.length; i++){
int j = i % h;
while(j <= i && elements[i] > elements[j]) j += h;//找到element[i]应该摆放的位置
if(j < i){
//将j之后的数据移动h位,然后把elements[i]移动到j处
int temp = elements[i];
for(int k = i-h;k >= j;k -= h){
elements[k+h] = elements[k];
}
elements[j] = temp;
}
}
}
}
步骤:
1.以h(h一般取n/2)为间隔将n个元素列分为几个小组,在每个小组内按直接插入法排序
2.令h=h/2,重复第1步
3.当h=1时,排序结束(此时相当于直接插入排序,不过由于数据已经基本排好序,因此比较次数和移动次数比直接插入排序少很多)
说明:希尔排序的时间性能优于直接插入排序;最后一个增量必须为1;希尔排序是不稳定的。希尔排序的分析是一个复杂的问题,因为他的时间是所取“增量”序列的函数,这涉及一些数学上尚未解决的难题。