标签:快速排序法 方法表 blog 快速 break return rgs val com
快速排序法是十分盛行的,因为它实现简单,效率很高,尤其是对于大量的数据进行排序且在一般应用比其他算法更快速,并且可以在原地排序(仅仅使用一个辅助栈), 且将长为N的无序数组排序所需的时间与N.logN成正比。
快速排序法思想:
- 取序列中的某个元素作为基准(pivot, 或称为枢轴,一般取第一个元素)
- 通过一趟排序,将待排序列划分(Partition)为左右两个子序列
- 左子序列元素的关键字均不大于基准元素的关键字,右子序列的关键字均不小于基准元素的关键字。
- 然后分别对左右两个子序列继续进行快速排序,直至整个序列有序。
图示:
注意:左右子序列元素的特点。
public static int partition(int[] aux,int lo,int hi) { int i=lo,j=hi+1; //左右两个指针,分别从两端开始 int val = aux[lo]; //去最左边的第一个元素为枢纽元素 while (true) { while (aux[++i]<val)if(i==hi)break; //左指针向右找到一个大于枢纽的 while (aux[--j]>val)if(j==lo)break; //右指针向左找到一个大于枢纽的 if(i==j) break; //这个i=j是很关键的,两指针重合,则表示能找的都找了! exch(aux,i,j); //i!=j,表示还有能找的! } exch(aux,lo,j); //把枢纽元素交换至它应该的位置! return j; //把划分点返回区,目的是说,从这里开始,两边分别已成为为左右子序列。 }
说明:
public static void sort(int[] aux,int lo,int hi) { if(lo>=hi) return; int val = partition(aux,lo,hi); //进行递归划分 sort(aux,lo,val-1); sort(aux,val+1,hi); }
说明:
我们在划分的时候已经说明:
return j; //把划分点返回区,目的是说,从这里开始,两边分别已成为为左右子序列。
partition方法表示已经将一个j的两边划分为左右子序列。
左子序列元素的关键字均不大于基准元素的关键字,右子序列的关键字均不小于基准元素的关键字。
但此时整个数组来说,还不是有序的,递归的进行划分,就是为了能让这种划分方法落实到每一个元素!
public class Main {
public static void main(String[] args) {
int[] aux={5,7,9,5,3,2};
sort(aux,0,aux.length-1);
for (int i:
aux) {
System.out.println(i);
}
}
/*快速排序法,JAVA实现代码*/
public static int partition(int[] aux,int lo,int hi)
{
int i=lo,j=hi+1; //左右两个指针
int val = aux[lo];
while (true)
{
while (aux[++i]<val)if(i==hi)break;
while (aux[--j]>val)if(j==lo)break;
if(i==j) break;
exch(aux,i,j);
}
exch(aux,lo,j);
return j;
}
public static void sort(int[] aux,int lo,int hi)
{
if(lo>=hi)
return;
int val = partition(aux,lo,hi);
sort(aux,lo,val-1);
sort(aux,val+1,hi);
}
public static void exch(int[] aux,int i,int j)
{
int t=aux[i];
aux[i]=aux[j];
aux[j]=t;
}
}
标签:快速排序法 方法表 blog 快速 break return rgs val com
原文地址:http://www.cnblogs.com/MrSaver/p/6017981.html