package demos.order;
/**
* @author wyl
* @time 2018年7月12日下午1:43:43
* 希尔排序:即缩小增量排序
* 基本原理:
* 先将待排序的数组元素分成多个子序列,使得每个子序列的元素个属性相对较少,
* 然后对各个子序列进行直接插入排序,
* 待整个序列“基本有序后”,在对所有元素进行一次直接插入排序
*/
public class ShellSort {
public static void shellSort(int[] a){
int i,j,h;
int tmp;
for(h=a.length/2;h>0;h/=2){
for (i=h;i<a.length;i++) {
tmp=a[i];
for(j=i-h;j>=0;j-=h){
if (tmp<a[j]) {
a[j+h]=a[j];
}else {
break;
}
}
a[j+h]=tmp;
}
}
}
public static void print(int[] a){
for(int i=0;i<a.length;i++){
System.out.print(a[i]+" ");
}
System.out.println();
}
public static void main(String[] args) {
int[] a={4,2,8,9,0,6,7,1};
shellSort(a);
print(a);
}
}
package demos.order;
/**
* @author wyl
* @time 2018年7月12日下午1:43:43
* 堆排序:两个过程:①构建堆②交换堆顶元素与最后一个元素的位置
* 思想:
* 对于给定的n个记录,初始时把这些记录看做一个顺序存储的二叉树,
* 然后将其调整为一个大顶堆,然后将堆的最后一个元素与堆顶元素进行交换后,堆的最后一个元素即为最大记录;
* 接着将前 n-1个元素(即不包括最大记录)重新调整为一个大顶堆,
* 在将堆顶元素与当前堆的最后一个元素交换后得到次大的记录,
* 重复该过程,直到调整堆中只剩下一个元素为止,该元素即为最小记录,此时得到一个有序序列。
*/
public class HeapSort_2 {
public static void heapSort(int[] a){
int i;
int len=a.length;
for(i=len/2-1;i>=0;i--){
adjustMinHeap(a,i,len-1);
}
for(i=len-1;i>=0;i--){
int tmp=a[0];
a[0]=a[i];
a[i]=tmp;
adjustMinHeap(a, 0, i-1);
}
}
private static void adjustMinHeap(int[] a, int pos, int len) {
// TODO Auto-generated method stub
int tmp;
int child;
for(tmp=a[pos];2*pos+1<len;pos=child){
child=2*pos+1;//孩子结点的位置
if (child<len&&a[child]>a[child+1]) {//找到孩子结点值最小的位置
child++;
}
if (a[child]<tmp) { //孩子结点小于当前节点~~~当前结点指向孩子结点
a[pos]=a[child];
}else {
break;
}
}
a[pos]=tmp;
}
public static void print(int[] a){
for(int i=0;i<a.length;i++){
System.out.print(a[i]+" ");
}
System.out.println();
}
public static void main(String[] args) {
int[] a={4,2,8,9,0,6,7,1};
heapSort(a);
print(a);
}
}