排序算法(Java笔记)—插入排序&shell排序
插入排序(Insertion Sort):通过对数据执行逐个插入至合适的位置而完成排序工作;
- 首先对数组的前两个数据进行从小到大的排序。
- 将第三个数据与排好的两个数据比较,将第三个数据插入到合适的位置。
- 将第四个数据插入到已经排列好的前三个数据中。
- 重复以上过程,直到排序完成。
插入排序算法实例——代码实现:
//插入排序算法
int[] insertSort(int[] data){
//外循环,提取下一位数据与内循环中的数据比较
for(int i=1;i<data.length;i++){
int j=i;
int temp=data[j];
//内循环
for(j-=1;j>=0&&temp<data[j];j-=1){
data[j+1]=data[j];//若未找到,则将比temp更大的数据往后移一位
}
data[j+1]=temp;//当找到比temp数据更小的数据j时,将temp数据保存到j+1位置
}
return data;
}
运行测试:
// 插入排序算法测试
public static void main(String[] args) {
int[] data = new int[] {9,4,6,8,7,1};
SuanFa sf = new SuanFa();
data = sf.insertSort(data);
System.out.println(Arrays.toString(data));
}
//运行结果:
[1, 4, 6, 7, 8, 9]
插入排序在对n个数据进行排序的时候,无原数据有无顺序,都需要进行n-1步的中间排序,在数据已有一定顺序的情况下,排序效率较好;但如果数据无规则,则需要移动大量的数据,其排序效率也不是很好;
shell排序:也叫希尔排序或缩小增量排序。基于插入排序的思想。
-
将有n个元素的数组分为n/2个数字序列,第一个数据和地n/2+1个数据为一对
- 一次循环使每一个序列对排好顺序。
- 然后,再次将数组分为n/4个数字序列,再次排序。
- 重复分组,直到数字序列n/(2*x)=1,完成排序。
shell排序算法实例——代码实现:
//shell排序算法
int[] shellSort(int[] data){
//分组排序
for(int i=data.length/2;i>=1;i/=2){
//进行插入排序
for(int j=i;j<data.length;j++){
int k=j;
int temp=data[k];
for(k-=i;k>=0&&temp<data[k];k-=i){
data[k+i]=data[k];
}
data[k+i]=temp;
}
}
return data;
}
运行测试:
// shell排序算法测试
public static void main(String[] args) {
int[] data = new int[] {9,4,6,8,7,1};
SuanFa sf = new SuanFa();
data = sf.shellSort(data);
System.out.println(Arrays.toString(data));
}
//运行结果:
[1, 4, 6, 7, 8, 9]