java有关快速排序法的分析

本人接触排序的程序还是本科读书时学习c语言的时候,那时候老师讲解简单,并没有认真学习,知道什么是选择排序,什么是冒泡排序,对于这两种排序的方法掌握比较牢固。今天在看书的时候,好多人都在分析不同排序方法优缺点,进而引发了对各种排序的深刻学习(其实抱着使用的目的,只学习了选择排序这一种方法,因为它够快O(N*logN),但是缺点是排序稳定性不足,在这方面冒泡显示出了独特的优势)。

以前没有接触大量的数据,对于程序的理解,只要能完成指定的功能就算OK(现在也是),没有深入理解。本文把对于快速排序的过程讲解给大家。

有关快速排序的解读,请见百度  http://baike.baidu.com/view/19016.htm?fr=aladdin#3_4

一趟快速排序的算法是:
1)设置两个 变量i、j, 排序开始的时候:i=0,j=N-1;
2)以第一个 数组元素作为关键数据,赋值给 key,即 key=A[0];
3)从j开始向前搜索,即由后开始向前搜索(j--),找到第一个小于 key的值A[j],将A[j]和A[i]互换;
4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于 key的A[i],将A[i]和A[j]互换;
5)重复第3、4步,直到i=j; (3,4步中,没找到符合条件的值,即3中A[j]不小于 key,4中A[i]不大于 key的时候改变j、i的值,使得j=j-1,i=i+1,直至找到为止。找到符合条件的值,进行交换的时候i, j指针位置不变。另外,i==j这一过程一定正好是i+或j-完成的时候,此时令循环结束)

它的核心是:每次选取标准,将整个数组分两部分。例如:A,B,C其中B是我们的标准,A数组全部都是比B小的数据,C中全部都是比B大的数据;第二次在数组A中再次递归使用这种办法排序,直到A数组从小到大排完;第三次对于数组C进行递归。这样就确保所有完成。

本人以模拟运算的方式把该过程解释一下,主要是第一次的分解。

   下标 0 1 2 3 4 5
   数据 3 1 4 2 6 5
第一次,设置i=0,j=5,key=3。

j=5,x[j]=5>3,j=j-1=4

j=4,x[j]=6>3,j=j-1=3

j=3,x[j]=2>3,此时交换(i=0,j=3)

下标 0 1 2 3 4 5
数据 2 1 4 3 6 5

第二次,此时i需要加1,因为刚刚交换了,说明交换来的数据肯定比key小,没有必要再次比较。

i=1,x[i]=1<3,i=i+1=2

i=2,x[i]=4>3,此时交换(i=2,j=3)

下标 0 1 2 3 4 5
数据 2 1 3 4 6 5
第三次,j=2=i,说明此时完成了3作为标准的排序,下面分别对2,1和4,6,5进行排序。

//快速排序方法
public class QuickSort 
{
public static void main(String[] args) 
{
int array1[]={13,1,24,2,16,2};//开辟数组
Quick_Sort(array1,0,array1.length-1);//调用方法
System.out.println("数组最终排序结果:");
print(array1);
}
public static void Quick_Sort(int array1[],int low,int high)
{
int i=low;
int j=high;
int key=array1[low];//设定轴值,即标准,这里可以使用任意值或者中间值
int temp=0;
while(i<j)
{
while(array1[j]>key && i<j)//从右向左进行寻找比key小的值
{ 
j--;
}
if(i<j)
{
temp=array1[i];
array1[i]=array1[j];
array1[j]=temp;
++i;
}
while(array1[i]<key && i<j)//从左向右进行寻找比key大的值
{
++i;
}
if(i<j)
{
temp=array1[j];
array1[j]=array1[i];
array1[i]=temp;
--j;
}
}
//不断进行递归 
if(i>low)
{
Quick_Sort(array1,low,i-1);//重新划分区间排序
}
if(j<high)
{
Quick_Sort(array1,j+1,high);
}
}
public static void print(int x[])
{
for(int k=0;k<x.length;++k)
{
System.out.println("x[" +k+ "]"+ "="+x[k]);
}
}


}
做法2并不是直接进行交换,而是取代,取代之后保证最后i被取代后的位置由key代替即可。
//快速排序方法2
public class QuickSort 
{
public static void main(String[] args) 
{
int array1[]={13,1,24,2,16,2};
Quick_Sort(array1,0,array1.length-1);
System.out.println("数组最终排序结果:");
print(array1);
}
public static void Quick_Sort(int array1[],int low,int high)
{
int i=low;
int j=high;
int key=array1[low];
while(i<j)
{
while(array1[j]>key && i<j)
{ 
j--;
}
if(i<j)
{
array1[i]=array1[j];
++i;

}
while(array1[i]<key && i<j)
{
++i;
}
if(i<j)
{ 
array1[j]=array1[i];
--j;
}
array1[i]=key;
}
//print(array1);//每排序一次就输出结果
//不断进行递归 
if(i>low)
{
Quick_Sort(array1,low,i-1);
}
if(j<high)
{
Quick_Sort(array1,j+1,high);
}
}
public static void print(int x[])
{
for(int k=0;k<x.length;++k)
{
System.out.println("x[" +k+ "]"+ "="+x[k]);
}
}


}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值