一、快速排序
问题:用快速排序来进行排序
分析:什么是快速排序?
快速排序:
它其实就是对冒泡排序的一种改进
主要会用到递归的方法
总体思路:
A-先有一组要排序的数据
B-然后遍历这组数据
(这里的i,x,y都是位置标记不代表数值)
C-把最后一个数据(i)作为一个基数
第一个数(x)作为最左边要排序的定位数
D-倒数第二个数(y)作为最右边要排序的定位数
E-①然后x向右移动,直到x>i停止
F-②然后y向左移动,直到y<i停止
G-③此时交换x和y所在位置的值
H-④然后重复①②③直到x与y直到同一位置j
I-⑤这个时候把此位置(j)的数据与i对应的数据进行交换
G-然后就可以发现:j前面的数据都比j小,j后面的数据都比j大
K-把数据分成比j小和比j大的两部分进行上面①②③④⑤步骤(递归实现)
二、代码实现
public class quickSort {
public static void main(String[] args) {
//定义一个数组调用自定义方法getArr();
int[] arr=getArr();
//调用自定义方法quickSortCode();
quickSortCode(arr,0,arr.length-1);
System.out.print("排序后的数组为:");
//增强for遍历排序后的数组
//这里注意增强for是JDK5的新特性,JDK版本太低可用不了增强for的哟
for(int arrs: arr){
System.out.print(arrs+" ");
}
}
//自定义获取数组的方法
private static int[] getArr() {
//键盘录入数组长度
Scanner sc =new Scanner(System.in);
System.out.println("请输入数组长度:");
int number=sc.nextInt();
int[] arr=new int[number];
//随机获取100以内的数据,并且不多于数组长度
for(int i=0; i<arr.length; i++){
arr[i]=(int)(Math.random()*100+1);
}
System.out.println("排序前的数组为:"+Arrays.toString(arr));
return arr;
}
//自定义快速排序方法
private static void quickSortCode(int[] arr, int leftNum, int rightNum) {
//首先判断避免数组溢出
if(leftNum>rightNum){
return;
}
//定义一个数获取最左边的编号
int left=leftNum;
//定义一个数获取最右边的编号
int right=rightNum;
//此数为基数
int baseNum=arr[rightNum];
//该循环来实现判断:
//左边的数比基数大停止向右移动
//右边的数比基数小停止向左移动
//左右两个数都停止时交换位置
while(left!=right){
while(left<right&&arr[left]<=baseNum){
left++;
}
while(left<right && arr[right]>=baseNum){
right--;
}
transform(arr, left, right);
}
//当左右两个数移动到同一个位置时交换基数与其中任意一个数所对应的数组数值
transform(arr, rightNum, right);
//递归实现,交换后的基数前面一部分数值继续进行快速排序
quickSortCode(arr, leftNum,right-1);
//递归实现,交换后的基数后面一部分数值继续进行快速排序
quickSortCode(arr, right+1, rightNum);
}
//自定义交换函数
private static void transform(int[] arr, int x, int y) {
int temp=arr[x];
arr[x]=arr[y];
arr[y]=temp;
}
}
示例结果:
请输入数组长度:
10
排序前的数组为:[49, 17, 46, 62, 15, 39, 53, 52, 57, 26]
排序后的数组为:15 17 26 39 46 49 52 53 57 62 成功构建 (总时间: 5 秒)
三、总结
写快排明显感觉比冒泡还有选择排序难了一些,其实就是那些判断条件要想好然后就是递归调用函数要会用,感觉这个排序算法想通的话其实还是可以接受的,过程是有点难受哈哈哈,但是算法就是要一点一点的啃啊!加油鸭!