直接插入排序
依次将待排序的数据,按其关键值的大小插入到前面的有序序列
实现代码
public class InsertSort
{
public static void main(String[] args)
{
DataWrap[] dataWraps =
{ new DataWrap(9, ""), new DataWrap(-16, ""), new DataWrap(21, "*"),
new DataWrap(23, ""), new DataWrap(-30, "*"),
new DataWrap(-49, "*"), new DataWrap(21, ""),
new DataWrap(30, "*"), new DataWrap(13, "*") };
System.out.println("排序之前:\n" + Arrays.toString(dataWraps));
insertSort(dataWraps);
System.out.println("排序之后:\n" + Arrays.toString(dataWraps));
}
public static void insertSort(DataWrap[] dataWraps)
{
int arrayLength = dataWraps.length;
for (int i = 1; i < arrayLength; i++)
{
// 保存当前关键元素
DataWrap tmp = dataWraps[i];
if (dataWraps[i].compareTo(dataWraps[i - 1]) < 0)
{
int j = i - 1;
for (; j >= 0 && tmp.compareTo(dataWraps[j]) < 0; j--)
{
dataWraps[j + 1] = dataWraps[j];
}
dataWraps[j + 1] = tmp;
}
System.out.println(Arrays.toString(dataWraps));
}
}
}
这种排序效率不高,时间复杂度:O( n2 n 2 )
折半插入排序
是对直接插入排序的优化
对前面的有序序列的中间值进行比较
实现代码
public class BinaryInsertSort
{
public static void main(String[] args)
{
DataWrap[] dataWraps =
{ new DataWrap(9, ""), new DataWrap(-16, ""), new DataWrap(21, "*"),
new DataWrap(23, ""), new DataWrap(-30, "*"),
new DataWrap(-49, "*"), new DataWrap(21, ""),
new DataWrap(30, "*"), new DataWrap(13, "*") };
System.out.println("排序之前:\n" + Arrays.toString(dataWraps));
binaryInsertSort(dataWraps);
System.out.println("排序之后:\n" + Arrays.toString(dataWraps));
}
public static void binaryInsertSort(DataWrap[] dataWraps)
{
int arrayLength = dataWraps.length;
for (int i = 1; i < arrayLength; i++)
{
DataWrap tmp = dataWraps[i];
int low = 0;
int high = i - 1;
while (low <= high)
{
int mid = (high + low) / 2;
// 大于中间值
if (tmp.compareTo(dataWraps[mid]) > 0)
{
low = mid + 1;
} else
{
high = mid - 1;
}
}
for (int j = i; j > low; j--)
{
dataWraps[j] = dataWraps[j - 1];
}
dataWraps[low] = tmp;
System.out.println(Arrays.toString(dataWraps));
}
}
}
与直接插入排序的效果基本相同,只是更快一些
Shell排序
实现代码
public class ShellSort
{
public static void main(String[] args)
{
DataWrap[] dataWraps =
{ new DataWrap(9, ""), new DataWrap(-16, ""), new DataWrap(21, "*"),
new DataWrap(23, ""), new DataWrap(-30, "*"),
new DataWrap(-49, "*"), new DataWrap(21, ""),
new DataWrap(30, "*"), new DataWrap(13, "*"),
new DataWrap(15, ""), new DataWrap(28, "*"),
new DataWrap(-2, "*") };
System.out.println("排序之前:\n" + Arrays.toString(dataWraps));
shellSort(dataWraps);
System.out.println("排序之后:\n" + Arrays.toString(dataWraps));
}
public static void shellSort(DataWrap[] dataWraps)
{
int arrayLength = dataWraps.length;
int h = 1;
while (arrayLength / 3 >= h)
{
h = h * 3 + 1;
}
while (h > 0)
{
System.out.println("===h的值:" + h + "===");
for (int i = h; i < arrayLength; i++)
{
DataWrap tmp = dataWraps[i];
if (dataWraps[i].compareTo(dataWraps[i - h]) < 0)
{
int j = i - h;
for (; j >= 0 && dataWraps[j].compareTo(tmp) > 0; j -= h)
{
dataWraps[j + h] = dataWraps[j];
}
dataWraps[j + h] = tmp;
}
System.out.println(Arrays.toString(dataWraps));
}
h = (h - 1) / 3;
}
}
}