/*
* 一、快速排序的思想
* 快速排序通过讲一个数组划分成两个子数组,然后通过递归调用自身为每一个子数组进行快速排序来实现。
* 二、进行划分int partition(long[] arr,int left,int right);
* 设置关键字 point,将比关键字小的数据放在一组,比关键字大的放在另外一组。
* 三、如何自动设置关键字。
* 设置数组最右端为关键字。
* 四、实现快速排序sort(long[] arr,int left,int right);
* 运用递归调用方法进行排序。
* 打印数组display(int[] arr);
*/
QuickSort.java
package test;
public class QuickSort {
public static int partition(long[] arr,int left,int right,long point) {
//创建左右指针
int leftPtr = left-1;
int rightPtr = right;
//创建循环
while(true) {
//将关键字左边都放置为小于point的数字
while(leftPtr < rightPtr && arr[++leftPtr] < point);
//将关键字右边都放置为大于point的数字
while(leftPtr < rightPtr && arr[--rightPtr] > point);
if(leftPtr>=rightPtr) {
//最后一次循环后leftPtr==rightPtr此时跳出while循环
break;
}else {
//此时arr[leftPtr]>point而且arr[rightPtr]<point;所以此时将两个位置进行交换
long temp = arr[leftPtr];
arr[leftPtr] = arr[rightPtr];
arr[rightPtr] = temp;
}
}
//将初始的right与(leftPtr==rightPtr)进行交换等同于point与(leftPtr==rightPtr)交换
long temp = arr[leftPtr];
arr[leftPtr] = arr[right];
arr[right] = temp;
//返回当前的point位置
return leftPtr;
}
//创建递归方法
public static void sort(long[] arr,int left,int right) {
if(left>=right) {
return;
}else {
long point=arr[right];
int partition = partition(arr, left, right,point);
//关键字左边的部分调用递归进行排序
sort(arr, left, partition-1);
//关键字右边的部分调用递归进行排序
sort(arr, partition+1, right);
}
}
//创建打印方法
public static void display(long[] arr) {
for(int i=0;i<arr.length;i++) {
System.out.print(arr[i]+" ");
}
System.out.println();
}
}
testSort.java
package test;
import java.util.Scanner;
public class testSort {
public static void main(String[] args) {
System.out.println("请输入数组的长度:");
Scanner sca = new Scanner(System.in);
long[] arr = new long[sca.nextInt()];
for(int i=0;i<arr.length;i++) {
arr[i] = (long)(Math.random()*50);
}
QuickSort.display(arr);
QuickSort.sort(arr, 0, arr.length-1);
QuickSort.display(arr);
}
}