标签:
每次将一个待排序的记录按其关键字大小插入到前面已经拍好序的子文件的适当位置,直到全部记录插入完成为止。
直接插入排序的基本操作是将一个记录插入到已排好序的有序表中,从而得到一个新的有序表。即假设待排序的记录存放在数组R[1······n]中,排序过程中,R被分成两个子区间R[1······i]和R[i+1······n],其中,R[1······i]是已经排好序的有序区;R[i+1······n]是当前未排序的部分。将当前无序区的第一个记录R[i+1]插入到有序区R[1······i]的适当位置,使R[1······i+1]变为新的有序区,每次插入一个数据,直到所有的数据有序为止。
/*************************
*
* 直接插入排序
*
*************************/
public class InsertSort {
private void insertSort(int[] datas) {
if (datas == null || datas.length < 2)
return;
int i, j, insertData;
for (i = 1; i < datas.length; i++) {
insertData = datas[i];// 要插入的变量
for (j = i - 1; j >= 0 && insertData < datas[j]; j--)
datas[j + 1] = datas[j];
datas[j + 1] = insertData;// 将要插入的数据放置到正确的位置
}
}
public static void main(String[] args) {
int[] datas = new int[] { 6, 5, 3, 1, 8, 7, 2, 4 };
System.out.println("********排序前********");
for (int i = 0; i < datas.length; i++) {
System.out.print(datas[i] + ",");
}
InsertSort insertSort = new InsertSort();
insertSort.insertSort(datas);
System.out.println("\n********排序后********");
for (int i = 0; i < datas.length; i++) {
System.out.print(datas[i] + ",");
}
}
}
先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组,所有距离为d1的倍数的记录放在同一个组中,在各组内进行插入排序;然后,取第二个增量d2 < d1,重复上述的分组和排序,直至所取得增量dt = 1(dt < dt-1 < ······ < d2 < d1),即所有记录放在同一个组中进行直接插入排序为止。
/*************************
*
* 希尔排序
*
*************************/
public class ShellSort {
private void shellSort(int[] datas) {
if (datas == null || datas.length < 2)
return;
int temp;// 暂存变量
int dataLength;// 步长
int pointer;// 进行处理的位置
dataLength = datas.length / 2;// 初始化步长
while (dataLength != 0) {
for (int j = dataLength; j < datas.length; j++) {
temp = datas[j];
pointer = j - dataLength;
while (pointer >= 0 && temp < datas[pointer]) {
datas[pointer + dataLength] = datas[pointer];
pointer = pointer - dataLength;
}
datas[pointer + dataLength] = temp;
}
dataLength = dataLength / 2;
}
}
public static void main(String[] args) {
int[] datas = new int[] { 6, 5, 3, 1, 8, 7, 2, 4 };
System.out.println("********排序前********");
for (int i = 0; i < datas.length; i++) {
System.out.print(datas[i] + ",");
}
ShellSort shellSort = new ShellSort();
shellSort.shellSort(datas);
System.out.println("\n********排序后********");
for (int i = 0; i < datas.length; i++) {
System.out.print(datas[i] + ",");
}
}
}
希尔排序的执行时间依赖于增量序列(步长)的选取。好的增量序列有如下特点:
希尔排序的时间性能要由于直接插入排序,原因如下:
希尔排序是一种不稳定的排序方法
参考资料:《数据结构与算法分析——java语言描述》、《大话数据结构》
【算法拾遗(java描述)】--- 插入排序(直接插入排序、希尔排序)
标签:
原文地址:http://blog.csdn.net/u012483425/article/details/50409415