原来插入排序希尔排序是这样的
Posted 编程365
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了原来插入排序希尔排序是这样的相关的知识,希望对你有一定的参考价值。
插入排序
因为你想,我们在打牌的时候,是不是先把手里的牌由小到大排好,然后每摸到一张牌,就依照大小把它放在排在正确的位置。同样,插入排序也是如此。
步骤:
-
首先选取数组第二个元素,若小于数组第一个元素,则插入到第一个位置,否则保持不动; -
接着选取第3个元素,把它和左边第一个元素比较,如果其小于左边第一个元素,则继续与左边第二个元素比较,知道遇到不比它大的元素,然后插入到这个元素右边。 -
然后依次选取第4、5、6....n个元素,重复第二个步骤,选择适当的位置插入。
举例说明:
public class InsertSort{
public static int []InsertSort(int[] arr) {
if(arr.length<=1)
return arr;
int len=arr.length;
for(int i=1;i<len;i++) {
int t=arr[i];
//找到插入位置
int k=i-1;
while(k>=0&&arr[k]>arr[i])
k--;
//arr[k]之后的元素右移一位
for(int j=i;j>k+1;j--)
{
arr[j]=arr[j-1]
}
//插入位置是k+1
arr[k+1]=t;
}
return arr;
}
}
希尔排序
对于希尔排序,其实是插入排序的一种变形。
在插入排序中,如果元素的有序程度不高或者数据规模比较大,则需要交换很多次才能到达正确位置。希尔排序通过分组的方式,先使数组局部有序,从而可以减少最后元素交换次数,降低时间复杂度。
希尔排序是采用插入排序的思想,先让数组中任意间隔h的元素有序,接着让数组中任意间隔为h/2的元素有序,接着h/4,h/8....,就这样一直缩小,当h=1时,数组中任意间隔为1的数组都是有序的,即完成了数组的排序。
虽然希尔排序需要进行多趟排序,但在数组元素有序程度不高或者数据规模较大的情况下,仍然要比插入排序要快的多。
public class ShellSort {
public static int[] shellSort(int arr[]) {
if(arr.length<=1)
return arr;
int n=arr.length;
//将数组元素以h为间隔分组,开始时h通常取n/2.
for(int h=n/2;h>0;h=h/2) {
for(int i=h;i<n;i++)
{
//对arr[i]进行插入排序
insertsort(arr,i,h);
}
}
return arr;
}
//arr[i]所在的组为arr[i-2*h]、arr[i-h]、arr[i+h]...
public static void insertsort(int arr[],int i,int h) {
int t=arr[i];
//空出位置
for(int k=i-h;k>0&&arr[k]>t;k-=h) {
arr[k+h]=arr[k];
}
//插入
arr[k+h]=t;
}
}
从代码中也可以看出,对各个组进行插入的时候并不是对一组排序完再对另一个组排,而是轮流对每个组进行插入排序。
小结
这篇文章简单介绍了下插入排序和希尔排序,接下来还会继续写剩下的排序算法。如果有关于文章的任何问题,欢迎加我的微信交流哦。
扫码关注
编程365
以上是关于原来插入排序希尔排序是这样的的主要内容,如果未能解决你的问题,请参考以下文章