本人接触排序的程序还是本科读书时学习c语言的时候,那时候老师讲解简单,并没有认真学习,知道什么是选择排序,什么是冒泡排序,对于这两种排序的方法掌握比较牢固。今天在看书的时候,好多人都在分析不同排序方法优缺点,进而引发了对各种排序的深刻学习(其实抱着使用的目的,只学习了选择排序这一种方法,因为它够快O(N*logN),但是缺点是排序稳定性不足,在这方面冒泡显示出了独特的优势)。
以前没有接触大量的数据,对于程序的理解,只要能完成指定的功能就算OK(现在也是),没有深入理解。本文把对于快速排序的过程讲解给大家。
有关快速排序的解读,请见百度 http://baike.baidu.com/view/19016.htm?fr=aladdin#3_4。
它的核心是:每次选取标准,将整个数组分两部分。例如:A,B,C其中B是我们的标准,A数组全部都是比B小的数据,C中全部都是比B大的数据;第二次在数组A中再次递归使用这种办法排序,直到A数组从小到大排完;第三次对于数组C进行递归。这样就确保所有完成。
本人以模拟运算的方式把该过程解释一下,主要是第一次的分解。
下标 | 0 | 1 | 2 | 3 | 4 | 5 | ||
数据 | 3 | 1 | 4 | 2 | 6 | 5 |
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 |
//快速排序方法
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]);
}
}
}