基于插入排序,将增量应用到插入排序,然后逐渐减小增量。希尔排序通过加大排序中元素之间的间隔,并在这些有间隔的元素中进行插入排序,从而使数据项能大跨度地移动<每隔n个元素进行排序>。当这些数据项排过一趟序之后,希尔排序算法减小数据项的间隔再进行排序 ,依次进行下去。间隔序列采用Knuth提出的:h = 3*h+1;此序列很常用。 效率:时间级从O(N^2/3)~O(N^7/6)
示例:
public class ShellSort {
private int[] a;
private int curLoc,size;
public ShellSort(int max){
size = max;
a = new int[max];
curLoc = 0;
}
public void insert(int ele){
a[curLoc++]=ele;
}
private void shellSort(){
int h=1,inner,outter,temp;
while(h<=curLoc/3){//h是间隔,在后面的计算中,h的值是不变的
h=3*h+1;
}
while(h>0){
for(outter = h;outter<curLoc;outter++){//outter不断向右移动
//a[outter]是标记元素,在插入排序中,标记元素右侧是带排序的元素
temp = a[outter];
inner = outter;//innner>=h
//inner>h-1保证inner-h>0
while(inner>h-1 && a[inner-h]>=temp){
a[inner] = a[inner-h];
inner -= h;
}
a[inner]=temp;//找到合適的位置,插入
}
h=(h-1)/3;
}
}}
2、快速排序
快速排序:是目前最流行的排序算法。在大多数情况下,快速排序都是最快的,执行时间为O(N*logN)。快速排序的根本机制是划分。划分数据就是把数据分为两组,使所有关键字大于特定值(枢纽)的数据项在一组,使所有关键字小于特定值(枢纽)的数据项在另外一组。然后递归排序即可。
1、把数组或者子数组划分为左边一组和右边一组;
2、调用自身对左边的一组进行排序;
3、再次调用自身对右边的一组进行排序;
枢纽的选择有多种方案,本示例采用数组的最右端的数据项作为枢纽;
public class FastSort {
private int[] a;
private int curLoc,size;
public FastSort(int max){
size = max;
a = new int[max];
curLoc = 0;
}
public void insert(int ele){
a[curLoc++]=ele;
}
/**
* 划分方法
* @param left 左边界
* @param right 右边界
* @param priovt 枢纽
*/
private int portionSort(int left,int right,int privot){
int leftPtr = left-1;
int rightPtr = right;
while(true){
while(a[++leftPtr] < privot);
while(rightPtr>0&&a[--rightPtr] > privot);
if(leftPtr >= rightPtr)
break;
else
swap(leftPtr,rightPtr);
}
swap(leftPtr, right);//将枢纽放置到正确的位置
return leftPtr;
}
private void fastSort(int left,int right){
if(right-left<=0){
return;
}else{
int privot = a[right];
int portion = portionSort(left, right, privot);
fastSort(left, portion-1);
fastSort(portion+1, right);
}
}
private void swap(int pos1,int pos2){
int temp = a[pos1];
a[pos1] = a[pos2];
a[pos2] = temp;
}
}