-
快速排序算法步骤:
- 1、首先找到数组的基准数(一般是数组的第一位数)
- 2、定义左右两个指针,用于比较与基准数的大小,进行分区操作,小的放在左区,大的放在右区
- 3、对左右两区不断进行比较分区操作,直到每一个子集直有一个元素,即为全部有序
例题解析:
sum={26,38,95,86,23,15,59,82,51,41,62,75,89};
- 首先定义基准数:temp=26
左右指针:left=0,right=sum.length-1
- 此时基准数所在位置的数值可改变,首先判断指针right所指数值与基准数temp的大小,小于基准数则放在基准数所在位置,大于则在原地不动,然后right- -;
- 此时right所指的数值小于基准数temp,换在基准数所在位置,然后左指针left++;
- 然后比较左指针所指数值与基准数temp的大小,大于则换在right所指位置,然后right- -;
- 此时right所指位置的数值小于基准数temp,换在left所在位置,left++;
- 此时left所指数值大于基准数temp,换位,right- -;
- 此时right所指数值大于基准数temp,无需移动。基准数填在left所在位置;
- 将基准数temp左右两边进行分区;如图所示:
- 分别对两个分区进行再划分,直到每一个子集只有一个元素(此时即为有序)。
部分代码解析
分区操作的实现:
//使用循环实现分区操作
while(left<right)
{
//1.右指针左移,找到第一个小于基准值的数arr[right]
while(left<right && arr[right]>=num)
{
right--;
}
//2.将右侧找到的小于基准值的数填到left=0的位置,左指针右移left++
if(left<right)
{
arr[left]=arr[right];
left++;
}
//3.左指针右移,找到第一个大于等于基准值的数arr[left]
while(left<right && arr[left]<num)
{
left++;
}
//4.将左侧找到的大于等于基准值的数填到right的位置,右指针左移right--
if(left<right)
{
arr[right]=arr[left];
right--;
}
}
//确定基准值的最终位置
arr[left]=num;
递规调用实现左右分区:
if(low<high)
{
//分区操作,将一个数组分成两个分区,返回分区界限的索引值
int index=paratition(arr,low,high);
//对左分区进行排序
sort(arr,low,index-1);
//对右分区进行排序
sort(arr,index+1,high);
}
完整代码:
import java.util.Arrays;
/**
* 快速排序算法
* @author 17628
*
*/
public class sortquick {
private static int paratition(int[] arr, int low, int high) {
//定义左右指针left,right
int left=low;
int right=high;
//定义基准数(数组第一位数)
int num=arr[left];
//使用循环实现分区操作
while(left<right)
{
//1.右指针左移,找到第一个小于基准值的数arr[right]
while(left<right && arr[right]>=num)
{
right--;
}
//2.将右侧找到的小于基准值的数填到left=0的位置,左指针右移left++
if(left<right)
{
arr[left]=arr[right];
left++;
}
//3.左指针右移,找到第一个大于等于基准值的数arr[left]
while(left<right && arr[left]<num)
{
left++;
}
//4.将左侧找到的大于等于基准值的数填到right的位置,右指针左移right--
if(left<right)
{
arr[right]=arr[left];
right--;
}
}
//确定基准值的最终位置
arr[left]=num;
//返回索引值
return left;
}
private static void sort(int[] arr, int low, int high) {
if(low<high)
{
//分区操作,将一个数组分成两个分区,返回分区界限的索引值
int index=paratition(arr,low,high);
//对左分区进行排序
sort(arr,low,index-1);
//对右分区进行排序
sort(arr,index+1,high);
}
}
public static void sort(int []arr) {
int low=0;
int high=arr.length-1;
sort(arr,low,high);
}
public static void main(String[] args) {
//定义排序数组
int []sum={15,26,38,95,86,23,59,82,51,41,62,75,89};
//输出初始数组
System.out.println("排序前数组:"+"\n"+Arrays.toString(sum));
//定义快速排序算法进行排序
sort(sum,low,high);
//输出排序后数组
System.out.println("排序后数组:"+"\n"+Arrays.toString(sum));
}
}
运行结果如下: