利用Java实现插入排序和希尔排序
首选简绍一下这两种排序算法的思想。
插入排序的总体思路就是从未排序的序列中每次查找一个元素和已经排好顺序的序列中的数据进行比较大小,然后进行插入操作。具体实现就是,将一个待排序的值先存放在临时变量里面,然后遍历已经有序的序列,进行比较,找到合适位置将待插入值插入即可。代码实现如下:
public void insertSort(){
//待排序的数组
int[] arrs = {23,43,56,42,65,72,13,35,57,74,29};
//存放待插入的值
int temp = 0;
for(int i=1;i<arrs.length;i++){
int[] arrs = {23,43,56,42,65,72,13,35,57,74,29};
//存放待插入的值
int temp = 0;
for(int i=1;i<arrs.length;i++){
temp = arrs[i];
int j=i-1;
//比较带插入值与已经有序的序列中的值大小关系
for(;j>=0&&temp<arrs[j];j--){
for(;j>=0&&temp<arrs[j];j--){
arrs[j+1] = arrs[j];
}
arrs[j+1] = temp;
}
//对排序后的数组输出
for(int i=0;i<arrs.length;i++){
System.out.print(arrs[i]+" ");
}
}
希尔排序的总体思路:算法先将要排序的一组数按某个增量d(n/2,n为要排序数的个数)分成若干组,每组中记录的下标相差d.对每组中全部元素进行直接插入排序,然后再用一个较小的增量(d/2)对它进行分组,在每组中再进行直接插入排序。当增量减到1时,进行直接插入排序后,排序完成。具体代码实现如下:
public void shellSort(int[] arrs){
while(true){
while(true){
//确定间距大小,一般以数组的总长度的一半为间隔开始
int d = (int) Math.ceil(arrs.length/2);
int temp = 0;
for(int i=0;i<d;i++){
for(int j=i+d;j<arrs.length;j+=d){
int d = (int) Math.ceil(arrs.length/2);
int temp = 0;
for(int i=0;i<d;i++){
for(int j=i+d;j<arrs.length;j+=d){
int x = j-d;
temp = arrs[j];
for(;x>=0&&temp<arrs[x];x-=d){
arrs[x+d] = arrs[x];
}
for(;x>=0&&temp<arrs[x];x-=d){
arrs[x+d] = arrs[x];
}
arrs[x+d] = temp;
}
}
if(d == 1){
break;
}
}
}