提到希尔排序,首先要知道插入排序。插入排序属于一种简单排序,它假设了数组中的数据部分有序,也就是说标志位左侧的数据已经有序,标志位右侧数据无序。然后用标志位与前面的数据进行比较,插入适当的位置。具体的实现代码如下:
/*插入排序*/
for(i = 1 ; i<arr.length;i++){
temp = arr[i];
j = i;
while(j>0&&arr[j-1]>temp){
arr[j] = arr[j-1];
j--;
}
arr[j] =temp;
}
希尔排序实际上是对插入排序的一种优化,主要是为了节省数组移动的次数。具体做法是,扩大数字之间的比较间隔,如何是10个数字进行排序的话,根据公式h=h*3+1,那么比较间隔为4。也就是说是数组下标{0,4,8};{1,5,9};{2,6};{3,7}进行比较,然后将比较间隔降低,根据公式h=(h-1)*3得1,在进行比较(实际就是插入排序的方法了),左后得出结果。具体代码如下:
/*希尔排序*/
while(arr.length/3>h){
h = h*3+1;
}
while(h>0){
for(i = h; i >0 ; i++){
temp = arr[i];
j =i;
while(j >h-1 && arr[j-h]>temp ){
arr[j] = arr[j-h];
j -=h;
}
arr[j] = temp;
}
h = (h-1)/3;
}
希尔排序在数字比较少的情况下显得并不是十分优秀,但是对于大数据量来说,它要比插入排效率高的多。
/*插入排序*/
for(i = 1 ; i<arr.length;i++){
temp = arr[i];
j = i;
while(j>0&&arr[j-1]>temp){
arr[j] = arr[j-1];
j--;
}
arr[j] =temp;
}
希尔排序实际上是对插入排序的一种优化,主要是为了节省数组移动的次数。具体做法是,扩大数字之间的比较间隔,如何是10个数字进行排序的话,根据公式h=h*3+1,那么比较间隔为4。也就是说是数组下标{0,4,8};{1,5,9};{2,6};{3,7}进行比较,然后将比较间隔降低,根据公式h=(h-1)*3得1,在进行比较(实际就是插入排序的方法了),左后得出结果。具体代码如下:
/*希尔排序*/
while(arr.length/3>h){
h = h*3+1;
}
while(h>0){
for(i = h; i >0 ; i++){
temp = arr[i];
j =i;
while(j >h-1 && arr[j-h]>temp ){
arr[j] = arr[j-h];
j -=h;
}
arr[j] = temp;
}
h = (h-1)/3;
}
希尔排序在数字比较少的情况下显得并不是十分优秀,但是对于大数据量来说,它要比插入排效率高的多。
转载于:https://blog.51cto.com/mars401/175001