快速排序
快速排序是通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
package LanqiaoBeautiful.Second.Sort;
import java.util.Random;
/*
* 快速排序采用分治的思想,将一个数组分成两个部分,
* 取一个中间值,左边的比中间值小,右边的比中间值大,之后合并输出
*/
public class quickSort {
public static void main(String[] args) {
Random rs = new Random();
int[] arr = new int[new Random().nextInt(15)];
for(int i=0;i<arr.length;i++) {
arr[i] = rs.nextInt(100);
}
QuickSort(arr,0,arr.length-1);
print(arr);
}
static void print(int[] arr) {
for(int i=0;i<arr.length;i++) {
System.out.print(arr[i]+" ");
}
}
static void QuickSort(int[] arr, int l, int r) {
if(l<r) {
int middle = Parttion(arr,l,r);
QuickSort(arr,l,middle-1);
QuickSort(arr,middle+1,r);
}
}
static int Parttion(int[] arr, int l, int r) {
int privor = arr[l]; //定义数组最左边的元素为主元
int sp= l+1; //定义数组最右边的数组元素为sp指针
int right = r; //定义首元后面的数组的元素为right指针
while(sp<=right) {
if(arr[sp]<privor) {
sp++;
}else {
swap(arr,sp,right); //交换数组sp和right下标的值
right--;
}
}
//当跳出循环后,我们再交换主元与right的值并返回下标right
swap(arr,l,right);
return right;
}
static void swap(int[] arr, int sp, int right) {
int temp= arr[sp];
arr[sp] = arr[right];
arr[right] = temp;
}
}
随机生成一个数组然后排序输出,利用分而治之的思想,把一个数组以middle为界分成左右两个部分,左边小,右边大,然后合并直接输出
附上一张测试截图: