经典算法
文章目录
前言
就算法而言,我们主要学习的是数学+思维+逻辑+数据结构实现功能,所以我们主要学习是思维也是解决问题的思路,然后用逻辑去实现它。。
提示:以下是本篇文章正文内容,下面案例可供参考
一、什么是快速排序?
每次选择一个元素,通过一趟的过程,前后比较,从而找到自己的合适位置,即此位置前的都比次数小,此位置之后的,都比次数大。
然后再对已经分割的两部分,重复递归使用相同的方法来找每个数的位置。递归嵌套即可完成排序。
二、代码实现
代码如下(示例):
package com.zrrd.lianxi;
import java.util.Arrays;
public class 快速排序 {
public static void main(String[] args) {
int[] arr = {
3,6,4,5,7,13,12,1,8,2,10,9,11,14,16,15};
queryPaiXu(arr, 0, arr.length-1);
System.out.println(Arrays.toString(arr));
}
//传入数组 shuzu,a=数组长度开始为0,b=最后长度位置为shuzu.size()-1
public static void queryPaiXu(int[] shuzu,int a,int b) {
//定义变量i、j、k、m
int i, j, k, m;
//判断时候有效数组,如果开始长度大于末尾长度为无效数组,直接返回
if (a > b) {
return;
}
//将开始长度值,赋值给 i 变量
i = a;
//将末尾长度值,赋值给 j 变量
j = b;
//取到数组下角标为0的首位值,赋值给 k 变量
k = shuzu[a];
//循环判断,开始长度是否小于数组最大长度
while (i < j) {
//如果k数组首位值小于等于末位置shuzu[j] 并且 开始长度是否小于数组最大长度
while (k <= shuzu[j] && i < j) {
// -1 便于执行下一次判断
j--;
}
//如果k数组首位值大于等于首位置shuzu[i] 并且 开始长度是否小于数组最大长度
while (k >= shuzu[i] && i < j) {
// +1 便于执行下一次判断
i++;
}
//最后判断,i 的值是否小于j 的值,为true执行逻辑体
if (i < j) {
//把数组末尾值赋给临时变量 m 用于存储
m = shuzu[j];
//把首位值与末位置进行交换 此时末位置存放的是首位值
shuzu[j] = shuzu[i];
//再把临时变量 m 赋值给首位值,就完成相邻首末数值的交换
shuzu[i] = m;
}
}
//此时 i 已经+1 变成相邻第二个位置,把他的值在赋给首位
shuzu[a] = shuzu[i];
shuzu[i] = k;
//递归算法,在次调用方法执行
queryPaiXu(shuzu, a, j - 1);
queryPaiXu(shuzu, j + 1, b);
}
}
效果截图:
总结
提示:这里主要是用到了递归的思想去优化,通过降低时间复杂度,来实现快速排序。