随机化快速排序
题目描述
使用Java或C++等语言中内置的随机函数实现随机化快速排序,在数组中随机选择一个元素作为分区的主元(Pivot)。
输入
多组样例输入,每组由一个一维整型数组组成。
输出
随机化快速排序之后的一维整型数组(升序排列)。
样例输入
6 1 8 6 5 3 4
5 12 42 2 5 8
样例输出
1 3 4 5 6 8
2 5 8 12 42
Code
package Week7;
import java.util.Scanner;
//随即快排,随机选一个数作为第一个。
//p = (int) (p +1+ Math.random() * (q- p + 1));
public class QE {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int num;
while(sc.hasNext()){
num = sc.nextInt();
int[] arr = new int[num];
//输入长度为num的数组
for(int i=0;i<arr.length;i++){
arr[i] = sc.nextInt();
}
int[] result = quickSort(arr,0,num-1);
//System.out.println(result);
for(int i=0;i<result.length;i++){
System.out.print(result[i]+" ");
}
}
}
//先写一个交换函数
public static void swap(int[] a, int i, int j){
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
//再来写一个分区函数
public static int partition(int[] arr,int p,int q){
//p为起点坐标,q为终点坐标
int y= (int) (p + Math.random() * (q- p + 1));
//把p和第一个换回来
swap(arr,p,y);
int x =arr[p];
int i = p, j;
//从起点后面一个数开始跟起点比较
for(j = p + 1;j <= q; j++)
{
if(arr[j]<=x) {
i++;
//如果比起点小,就和起点交换
swap(arr,i,j);
}
// for(int i1=0;i1<arr.length;i1++){
// System.out.print(arr[i1]);
// }
// System.out.println();
}
//交换完之后,改变起点
swap(arr,p,i);
//返回坐标
return i;
}
//最后写一个小快排
public static int[] quickSort(int[] arr, int p, int q)
{
//P<q时继续快排
if(p < q)
{
//调用分区函数
int r = partition(arr, p, q);
//对分区后的左边进行快排
quickSort(arr, p, r-1);
//对分区后的右边进行快排
quickSort(arr, r+1, q);
}
return arr;
}
}