数据结构之高级排序<希尔排序、快速排序>

本文介绍了两种高级排序算法——希尔排序和快速排序。希尔排序通过设置间隔序列对元素进行插入排序,时间复杂度为O(N^2/3)~O(N^7/6)。快速排序是广泛应用的排序算法,平均时间复杂度为O(N*logN),基于划分数据并递归排序的机制。文中提供了两种排序算法的Java实现示例。
摘要由CSDN通过智能技术生成
1、希尔排序

 基于插入排序,将增量应用到插入排序,然后逐渐减小增量。希尔排序通过加大排序中元素之间的间隔,并在这些有间隔的元素中进行插入排序,从而使数据项能大跨度地移动<每隔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;
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值