public class 分治_快速排序 {
/**
*交换函数,i,j为数组索引
*/
static void swap(int A[], int i, int j)
{
int temp = A[i];
A[i] = A[j];
A[j] = temp;
}
/**
* 选取一个关键字(key)作为枢轴,一般取整组记录的第一个数/最后一个,这里采用选取序列最后一个数为枢轴。
* 设置两个变量left = 0;right = N - 1;
* 从left一直向后走,直到找到一个大于key的值,right从后至前,直至找到一个小于key的值,然后交换这两个数。
* 重复第三步,一直往后找,直到left和right相遇,这时将key放置left的位置即可。
* @return
*/
static int PartSort(int[] array,int left,int right)
{
int key = array[right];//定义基准
int count=right;//保存rigth值
while(left < right)//防止数组越界
{
while(left < right && array[left] <= key)
{
++left;
}
while(left < right && array[right] >= key)
{
--right;
}
swap(array,left,right);
}
swap(array,right,count);
return right;
}
/**
*分治思想,递归调用
*/
static void QuickSort(int array[],int left,int right)
{
if(left >= right)//表示已经完成一个组
{
return;
}
int index = PartSort(array,left,right);//枢轴的位置
QuickSort(array,left,index - 1);
QuickSort(array,index + 1,right);
}
public static void main(String[] args) {
int a[]= {1,5,-5,54,15,67,16,23};
QuickSort(a,0,7);
for(int i=0;i<a.length;i++) {
System.out.print(" "+a[i]);
}
System.out.print("\n");
}
}
快速排序过程:
定义数组最右边为枢轴即为KEY,从左往右 先找到a[left]>key的情况,再找到a[right]<key的情况,两者交换继续执行,最后让枢轴和最后的right交换,最后的right即为 left和right相遇时的情况;再递归由枢轴左右分割的两个数组继续执行直到排序结束,其为本人个人理解;
如不明白可点击如下链接再进行详细了解
https://blog.csdn.net/sdoog_owt/article/details/80058870