简单的插入排序由于需要一个一个地移动中间数据,因此平均复杂度高,因此---》希尔排序,注意几下几点:
1.希尔排序适合中等大小规模的数组
2.希尔排序是对插入排序的改进,插入排序中在插入新的数据前,需要一个一个地移动中间数据,通过希尔排序,可以不必一个个地移动
3.希尔排序不是稳定的,虽然插入排序是稳定的,但是由于多次插入操作,相同的元素可能在各自的插入排序中移动,稳定性会被打乱
4.属于插入类排序
package merge;
import java.util.Arrays;
/**
* 希尔排序适合中等大小规模的数组
* 希尔排序是对插入排序的改进,插入排序中在插入新的数据前,需要一个一个地移动中间数据,通过希尔排序,可以不必一个个地移动
* 希尔排序不是稳定的,
* 虽然插入排序是稳定的,但是由于多次插入操作,相同的元素可能在各自的插入排序中移动,稳定性会被打乱
* 属于插入类排序
* @author Administrator
*
*/
public class ShellSort {
private int[] items;
private int size;
public ShellSort(int[] arrays) {
size = arrays.length;
items = Arrays.copyOf(arrays, size);
}
public int[] sort() {
shellSort();
return items;
}
private void shellSort() {
int h = getStep();
//不断减小步长
while(h >= 1) {
for(int i = 0; i < h; i++) {
insertSort(i,h);
}
h = (h-1)/3;
}
}
/**
* 对间隔为step,起点为start的数据项做插入排序
* @param start
* @param step
*/
private void insertSort(int start,int step) {
for(int i = start + step; i < size; i = i+step) {
int key = items[i];
int j = i - step;
for(;j >= start; j=j-step) {
if(items[j] > key) {
items[j+step] = items[j];
}
else
{
break;
}
}
items[j+step] = key;
}
}
/**
* 得到最大的步长
*
* @return
*/
private int getStep() {
int step = 1;
while(step < size) {
step = 3 * step + 1;
}
return step;
}
public static void main(String[] args)
{
int[] a= new int[] {1,0,9,8,7,6,5,4,3,3,2,1,11,2,21,19,11,99,97,37};
ShellSort m = new ShellSort(a);
a = m.sort();
for(int item : a)
{
System.out.print(item + " ");
}
}
}
1.希尔排序适合中等大小规模的数组
2.希尔排序是对插入排序的改进,插入排序中在插入新的数据前,需要一个一个地移动中间数据,通过希尔排序,可以不必一个个地移动
3.希尔排序不是稳定的,虽然插入排序是稳定的,但是由于多次插入操作,相同的元素可能在各自的插入排序中移动,稳定性会被打乱
4.属于插入类排序
package merge;
import java.util.Arrays;
/**
* 希尔排序适合中等大小规模的数组
* 希尔排序是对插入排序的改进,插入排序中在插入新的数据前,需要一个一个地移动中间数据,通过希尔排序,可以不必一个个地移动
* 希尔排序不是稳定的,
* 虽然插入排序是稳定的,但是由于多次插入操作,相同的元素可能在各自的插入排序中移动,稳定性会被打乱
* 属于插入类排序
* @author Administrator
*
*/
public class ShellSort {
private int[] items;
private int size;
public ShellSort(int[] arrays) {
size = arrays.length;
items = Arrays.copyOf(arrays, size);
}
public int[] sort() {
shellSort();
return items;
}
private void shellSort() {
int h = getStep();
//不断减小步长
while(h >= 1) {
for(int i = 0; i < h; i++) {
insertSort(i,h);
}
h = (h-1)/3;
}
}
/**
* 对间隔为step,起点为start的数据项做插入排序
* @param start
* @param step
*/
private void insertSort(int start,int step) {
for(int i = start + step; i < size; i = i+step) {
int key = items[i];
int j = i - step;
for(;j >= start; j=j-step) {
if(items[j] > key) {
items[j+step] = items[j];
}
else
{
break;
}
}
items[j+step] = key;
}
}
/**
* 得到最大的步长
*
* @return
*/
private int getStep() {
int step = 1;
while(step < size) {
step = 3 * step + 1;
}
return step;
}
public static void main(String[] args)
{
int[] a= new int[] {1,0,9,8,7,6,5,4,3,3,2,1,11,2,21,19,11,99,97,37};
ShellSort m = new ShellSort(a);
a = m.sort();
for(int item : a)
{
System.out.print(item + " ");
}
}
}