本文资料、图片均来自网络,作者只是简单说明案例
各大排序的简介
下面来说说插入排序
插入排序里面有两个排序
直接插入排序
基本思想:在要排序的一组数中,假设前面(n-1)[n>=2] 个数已经是排
好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数
也是排好顺序的。如此反复循环,直到全部排好顺序。
package sort;
public class InsertSort {
public InsertSort() {
int a[] = { 49, 38, 65, 97, 76, 13, 27, 49, 78, 34, 12, 64, 5, 4, 62, 99, 98, 54, 56, 17, 18, 23, 34, 15, 35,
25, 53, 51 };
int temp = 0;
for (int i = 1; i < a.length; i++) {
int j = i - 1;//只需要排length-1次
temp = a[i];
/**
* 直接在for 里面处理
*/
for (; j >= 0 && temp < a[j]; j--) {
a[j + 1] = a[j]; // 将大于temp的值整体后移一个单位
}
a[j + 1] = temp;
}
for (int i = 0; i < a.length; i++) {
System.out.print(a[i]+" ");
}
}
public static void main(String[] args) {
new InsertSort();
}
}
还有一个 希尔排序(最小增量排序)
算法先将要排序的一组数按某个增量d(n/2,n为要排序数的个数)分成若干组,每组中记录的下标相差d.对每组中全部元素进行直接插入排序,然后再用一个较小的增量(d/2)对它进行分组,在每组中再进行直接插入排序。当增量减到1时,进行直接插入排序后,排序完成。
package sort;
/**
* 希尔排序 (最小增量排序)
*
* @author Striver-zw
*
*/
public class ShellSort {
public ShellSort() {
int a[] = { 1, 54, 6, 3, 78, 34, 12, 45, 16, 100 };
double d1 = a.length;
int temp = 0;
/**
* 算法先将要排序的一组数按某个增量d(n/2,n为要排序数的个数)分成若干组,每组中记录的下标相差d.对每组中全部元素进行直接插入排序,
* 然后再用一个较小的增量(d/2)对它进行分组,在每组中再进行直接插入排序。当增量减到1时,进行直接插入排序后,排序完成。
*/
while (true) {
/**
* ceil 则是不小于他的最小整数
* 如: 1.4 则 2
* 1.6 则 2
* -1.4 则 -1
* -1.6 则 -1
*/
d1 = Math.ceil(d1 / 2);
int d = (int) d1;
/**
* 遍历一半的数据
*/
for (int x = 0; x < d; x++) {
//遍历后半部分的数据
for (int i = x + d; i < a.length; i += d) {
int j = i - d;
temp = a[i];
//再用插入排序
for (; j >= 0 && temp < a[j]; j -= d) {
a[j + d] = a[j];
}
a[j + d] = temp;
}
}
if (d == 1) {//最后一个数就不用排序了
break;
}
}
for (int i = 0; i < a.length; i++) {
System.out.print(a[i] + " ");
}
}
public static void main(String[] args) {
new ShellSort();
}
}
代码不是很复杂,基本都看得懂。